Ejemplo n.º 1
0
        public async Task OnTick()
        {
            await Task.FromResult(0);

            try
            {
                PP.LastFlatbed(PP.Position.GetNearestFlatbed());

                if (PP.CurrentVehicle == LF)
                {
                    Game.DisableControlThisFrame(0, Control.VehicleMoveUpDown);
                    if (!LF.IsControlOutside())
                    {
                        if (manualControl)
                        {
                            if (Game.IsControlPressed(0, liftKey))
                            {
                                LF.DropBedManually(true);
                            }
                            if (Game.IsControlPressed(0, lowerKey))
                            {
                                LF.DropBedManually(false);
                            }
                        }
                        else
                        {
                            if (Game.IsControlJustPressed(0, hookKey))
                            {
                                await LF.DropBed();
                            }
                        }
                    }
                    FreezeEntityPosition(LF.Handle, false);
                    LF.IsPersistent = false;

                    if (LF.CurrentTowingVehicle().Handle != 0 && PP.IsInVehicle(LF))
                    {
                        if (Game.IsControlPressed(2, Control.VehicleAccelerate))
                        {
                            ApplyForceToEntity(Game.Player.LastVehicle.Handle, 3, 0F, -0.04F, 0F, 0F, 0F, 0F, 0, true, true, true, true, true);
                        }
                        if (Game.IsControlPressed(2, Control.VehicleBrake))
                        {
                            ApplyForceToEntity(Game.Player.LastVehicle.Handle, 3, 0F, 0.04F, 0F, 0F, 0F, 0F, 0, true, true, true, true, true);
                        }
                    }
                }
                else
                {
                    LF.IsPersistent = true;
                }

                if (PP.IsInVehicle())
                {
                    if (PP.CurrentVehicle.IsOnAllWheels)
                    {
                        if (DecorGetFloat(PP.CurrentVehicle.Handle, gHeightDecor) == 0f)
                        {
                            DecorSetFloat(PP.CurrentVehicle.Handle, gHeightDecor, PP.CurrentVehicle.HeightAboveGround);
                        }
                    }
                    if (PP.CurrentVehicle.IsThisFlatbed3() && !LFList.Contains(PP.CurrentVehicle))
                    {
                        LFList.Add(PP.CurrentVehicle);
                    }
                }

                if (LF.Exists())
                {
                    if (!PP.IsInVehicle(LF) && LF.IsControlOutside() && (PP.Position.DistanceTo(LF.ControlDummyPos()) <= 2f | PP.Position.DistanceTo(LF.ControlDummy2Pos()) <= 2f))
                    {
                        if (manualControl)
                        {
                            DisplayHelpTextThisFrame(String.Format(GetLangEntry("INM_FB_HELP", "Press {0} to lift/lower the bed."), $"{liftKey.GetButtonIcon()} {lowerKey.GetButtonIcon()}"));
                            if (Game.IsControlPressed(0, liftKey))
                            {
                                LF.DropBedManually(true);
                            }
                            if (Game.IsControlPressed(0, lowerKey))
                            {
                                LF.DropBedManually(false);
                            }
                        }
                        else
                        {
                            DisplayHelpTextThisFrame(String.Format(GetLangEntry("INM_FB_HELP", "Press {0} to lift/lower the bed."), hookKey.GetButtonIcon()));
                            if (Game.IsControlJustPressed(0, hookKey))
                            {
                                await LF.DropBed();
                            }
                        }
                    }

                    if (!DecorGetBool(LF.Handle, helpDecor) && LV.IsThisFlatbed3())
                    {
                        if (manualControl)
                        {
                            DisplayHelpTextThisFrame(String.Format(GetLangEntry("INM_FB_HELP", "Press {0} to lift/lower the bed."), $"{liftKey.GetButtonIcon()} {lowerKey.GetButtonIcon()}"));
                        }
                        else
                        {
                            DisplayHelpTextThisFrame(String.Format(GetLangEntry("INM_FB_HELP", "Press {0} to lift/lower the bed."), hookKey.GetButtonIcon()));
                        }
                        DecorSetBool(LF.Handle, helpDecor, true);
                    }

                    if (marker)
                    {
                        LF.DrawMarkerTick();
                    }
                    if (LF.IsFlatbedDropped())
                    {
                        LF.TurnOnIndicators();
                    }
                    else
                    {
                        LF.TurnOffIndicators();
                    }

                    if (LF.CurrentTowingVehicle().Handle != 0)
                    {
                        if (!LF.CurrentTowingVehicle().IsAttachedTo(LF))
                        {
                            LF.CurrentTowingVehicle(null);
                            TriggerServerEvent("flatbed:SetTowingVehicle", PP.Handle, LF.Handle, 0);
                        }
                    }

                    if (DoesEntityExist(GetEntityAttachedTo(LF.Handle)) && LF.CurrentTowingVehicle().Handle == 0)
                    {
                        LF.CurrentTowingVehicle(GetEntityAttachedTo(LF.Handle));
                        TriggerServerEvent("flatbed:SetTowingVehicle", PP.Handle, LF.Handle, GetEntityAttachedTo(LF.Handle));
                    }

                    if (PP.IsInVehicle()) //Player is in vehicle
                    {
                        //Detach towing vehicle if player is inside towing vehicle
                        if (PP.CurrentVehicle == LF.CurrentTowingVehicle())
                        {
                            if (LV.IsVehicleFacingFlatbed(LF))
                            {
                                await LF.CurrentTowingVehicle().DetachToFix(false);
                            }
                            else
                            {
                                await LF.CurrentTowingVehicle().DetachToFix(true);
                            }
                            LF.CurrentTowingVehicle().IsPersistent = false;
                            LF.CurrentTowingVehicle(null);
                            TriggerServerEvent("flatbed:SetTowingVehicle", PP.Handle, LF.Handle, 0);
                        }

                        //Load vehicle while player is pressing hookkey on bed
                        if (LV.IsAlive && LV.Position.DistanceTo(LF.AttachDummyPos()) <= 2f)
                        {
                            if (!LV.IsThisFlatbed3() && LF.CurrentTowingVehicle().Handle == 0 && AC.Contains(LV.ClassType))
                            {
                                DisplayHelpTextThisFrame(String.Format(GetLangEntry("INM_FB_HOOK", "Press {0} to load {1}."), hookKey.GetButtonIcon(), PP.CurrentVehicle.LocalizedName));
                                if (Game.IsControlJustPressed(0, hookKey))
                                {
                                    LF.CurrentTowingVehicle(PP.CurrentVehicle);
                                    TriggerServerEvent("flatbed:SetTowingVehicle", PP.Handle, LF.Handle, PP.CurrentVehicle.Handle);
                                    PP.CurrentVehicle.IsEngineRunning = false;
                                    PP.CurrentVehicle.IsPersistent    = true;
                                    if (PP.CurrentVehicle == LF.CurrentTowingVehicle())
                                    {
                                        PP.Task.LeaveVehicle(LF.CurrentTowingVehicle(), true);
                                    }
                                    await Delay(3000);

                                    if (LV.IsVehicleFacingFlatbed(LF))
                                    {
                                        LV.AttachToFix(LF, LF.AttachDummyIndex(), LV.AttachCoords(), Vector3.Zero);
                                    }
                                    else
                                    {
                                        LV.AttachToFix(LF, LF.AttachDummyIndex(), LV.AttachCoords(), new Vector3(0f, 0f, 180f));
                                    }
                                }
                            }
                        }

                        //Load vehicle while player is pressing hookkey on attach marker
                        if (LF.AttachPosition().IsAnyVehicleNearAttachPosition(2f))
                        {
                            if (!LV.IsThisFlatbed3() && LF.CurrentTowingVehicle().Handle == 0 && LF.IsFlatbedDropped() && AC.Contains(LV.ClassType))
                            {
                                if (LV.Model != LF.Model)
                                {
                                    DisplayHelpTextThisFrame(String.Format(GetLangEntry("INM_FB_HOOK", "Press {0} to load {1}."), hookKey.GetButtonIcon(), LV.LocalizedName));
                                    if (Game.IsControlJustPressed(0, hookKey))
                                    {
                                        LF.CurrentTowingVehicle(LV);
                                        TriggerServerEvent("flatbed:SetTowingVehicle", PP.Handle, LF.Handle, LV.Handle);
                                        LV.IsPersistent = true;
                                        if (DecorGetFloat(LF.CurrentTowingVehicle().Handle, gHeightDecor) == 0f && LV.IsOnAllWheels)
                                        {
                                            DecorSetFloat(LF.CurrentTowingVehicle().Handle, gHeightDecor, LF.CurrentTowingVehicle().HeightAboveGround);
                                        }
                                        FreezeEntityPosition(LF.Handle, true);
                                        if (PP.CurrentVehicle == LV)
                                        {
                                            PP.Task.LeaveVehicle();
                                        }

                                        if (LV.IsVehicleFacingFlatbed(LF))
                                        {
                                            do
                                            {
                                                PP.Task.GoTo(LV.GetRopeHook());
                                                await Delay(100);
                                            } while (!(PP.Position.DistanceTo(LV.GetRopeHook()) <= 1.5f));
                                        }
                                        else
                                        {
                                            do
                                            {
                                                PP.Task.GoTo(LV.GetRopeHookRear());
                                                await Delay(100);
                                            } while (!(PP.Position.DistanceTo(LV.GetRopeHookRear()) <= 1.5f));
                                        }

                                        PP.Task.ClearAll();

                                        //Vehicle heading is almost same as Flatbed
                                        if (LV.IsVehicleFacingFlatbed(LF))
                                        {
                                            TriggerServerEvent("flatbed:AddRope", PP.Handle, LF.Handle, LV.Handle);
                                            ES = false;
                                            Rope rope = World.AddRope((RopeType)6, LF.WinchDummyPos(), Vector3.Zero, LF.WinchDummyPos().DistanceTo(LV.GetRopeHook()), 0.1f, false);
                                            rope.AttachEntities(LF, LF.WinchDummyPos(), LV, LV.GetRopeHook(), LF.WinchDummyPos().DistanceTo(LV.GetRopeHook()));
                                            rope.ActivatePhysics();
                                            do
                                            {
                                                if (ES == true)
                                                {
                                                    ES = false;
                                                    rope.StopWinding();
                                                    rope.DetachEntity(LF);
                                                    rope.DetachEntity(LV);
                                                    rope.Delete();
                                                    return;
                                                }
                                                if (!LV.IsAnyPedBlockingVehicle(LF))
                                                {
                                                    rope.StartWinding();
                                                    Game.DisableControlThisFrame(0, Control.VehicleMoveUpDown);
                                                }
                                                await Delay(5);
                                            } while (!(rope.Length <= 1.9f));
                                            rope.StopWinding();
                                            rope.DetachEntity(LF);
                                            rope.DetachEntity(LV);
                                            rope.Delete();
                                            FreezeEntityPosition(LF.Handle, false);
                                            LV.AttachToFix(LF, LF.AttachDummyIndex(), LV.AttachCoords(), Vector3.Zero);
                                        }
                                        //Vehicle heading is the opposite of Flatbed
                                        else
                                        {
                                            TriggerServerEvent("flatbed:AddRope", PP.Handle, LF.Handle, LV.Handle);
                                            ES = false;
                                            Rope rope = World.AddRope((RopeType)6, LF.WinchDummyPos(), Vector3.Zero, LF.WinchDummyPos().DistanceTo(LV.GetRopeHookRear()), 0.1f, false);
                                            rope.AttachEntities(LF, LF.WinchDummyPos(), LV, LV.GetRopeHookRear(), LF.WinchDummyPos().DistanceTo(LV.GetRopeHookRear()));
                                            rope.ActivatePhysics();
                                            do
                                            {
                                                if (ES == true)
                                                {
                                                    ES = false;
                                                    rope.StopWinding();
                                                    rope.DetachEntity(LF);
                                                    rope.DetachEntity(LV);
                                                    rope.Delete();
                                                    return;
                                                }
                                                if (!LV.IsAnyPedBlockingVehicle(LF))
                                                {
                                                    rope.StartWinding();
                                                    Game.DisableControlThisFrame(0, Control.VehicleMoveUpDown);
                                                }
                                                await Delay(5);
                                            } while (!(rope.Length <= 1.9f));
                                            rope.StopWinding();
                                            rope.DetachEntity(LF);
                                            rope.DetachEntity(LV);
                                            rope.Delete();
                                            FreezeEntityPosition(LF.Handle, false);
                                            LV.AttachToFix(LF, LF.AttachDummyIndex(), LV.AttachCoords(), Vector3.Zero);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else //Player is not in vehicle
                    {
                        //Unload vehicle while flatbed is lowered
                        if (LF.IsFlatbedDropped() && PP.Position.DistanceTo(LF.AttachDummyPos()) <= 3f)
                        {
                            if (World.GetDistance(LF.CurrentTowingVehicle().Position, PP.Position) <= 3f)
                            {
                                DisplayHelpTextThisFrame(String.Format(GetLangEntry("INM_FB_UNHOOK", "Press {0} to unload {1}."), hookKey.GetButtonIcon(), LF.CurrentTowingVehicle().LocalizedName));
                                if (Game.IsControlJustPressed(0, hookKey))
                                {
                                    Vehicle towVeh = LF.CurrentTowingVehicle();
                                    FreezeEntityPosition(LF.Handle, true);
                                    towVeh.SteeringScale = 0f;
                                    if (towVeh.IsVehicleFacingFlatbed(LF))
                                    {
                                        await towVeh.DetachToFix(false);
                                    }
                                    else
                                    {
                                        await towVeh.DetachToFix(true);
                                    }
                                    await Delay(1000);

                                    if (towVeh.IsDriveable2())
                                    {
                                        PP.Task.EnterVehicle(towVeh, VehicleSeat.Driver, 5000, 1f);
                                        do
                                        {
                                            Game.DisableControlThisFrame(0, Control.VehicleMoveUpDown);
                                            await Delay(5);
                                        } while (!(towVeh.Position.DistanceTo(LF.AttachPosition()) <= 2f));
                                    }
                                    else
                                    {
                                        do
                                        {
                                            if (towVeh.IsVehicleFacingFlatbed(LF))
                                            {
                                                towVeh.PushVehicleBack();
                                            }
                                            else
                                            {
                                                towVeh.PushVehicleForward();
                                            }
                                            Game.DisableControlThisFrame(0, Control.VehicleMoveUpDown);
                                            await Delay(5);
                                        } while (!(towVeh.Position.DistanceTo(LF.AttachPosition()) <= 2f));
                                    }

                                    FreezeEntityPosition(LF.Handle, false);
                                    towVeh.IsPersistent = false;
                                    LF.CurrentTowingVehicle(null);
                                    TriggerServerEvent("flatbed:SetTowingVehicle", PP.Handle, LF.Handle, 0);
                                }
                            }
                        }

                        if (LF.CurrentTowingVehicle().Handle == 0 && LF.IsFlatbedDropped() && LF.AttachPosition().IsAnyVehicleNearAttachPosition(2f))
                        {
                            Vehicle thatVehicle = PP.Position.WorldGetClosestVehicle();
                            //Vehicle heading is almost same as Flatbed
                            if (thatVehicle.Model != LF.Model && AC.Contains(thatVehicle.ClassType) && PP.Position.DistanceTo(thatVehicle.GetRopeHook()) <= 1.5f)
                            {
                                DisplayHelpTextThisFrame(String.Format(GetLangEntry("INM_FB_HOOK", "Press {0} to load {1}."), hookKey.GetButtonIcon(), thatVehicle.LocalizedName));
                                if (Game.IsControlJustPressed(0, hookKey))
                                {
                                    LF.CurrentTowingVehicle(thatVehicle);
                                    TriggerServerEvent("flatbed:SetTowingVehicle", PP.Handle, LF.Handle, thatVehicle.Handle);
                                    thatVehicle.IsPersistent = true;
                                    if (thatVehicle.IsOnAllWheels)
                                    {
                                        if (DecorGetFloat(thatVehicle.Handle, gHeightDecor) == 0f)
                                        {
                                            DecorSetFloat(thatVehicle.Handle, gHeightDecor, thatVehicle.HeightAboveGround);
                                        }
                                    }
                                    FreezeEntityPosition(LF.Handle, true);
                                    TriggerServerEvent("flatbed:AddRope", PP.Handle, LF.Handle, LV.Handle);
                                    ES = false;
                                    Rope rope = World.AddRope((RopeType)6, LF.WinchDummyPos(), Vector3.Zero, LF.WinchDummyPos().DistanceTo(thatVehicle.GetRopeHook()), 0.1f, false);
                                    rope.AttachEntities(LF, LF.WinchDummyPos(), thatVehicle, thatVehicle.GetRopeHook(), LF.WinchDummyPos().DistanceTo(thatVehicle.GetRopeHook()));
                                    rope.ActivatePhysics();
                                    do
                                    {
                                        if (ES == true)
                                        {
                                            ES = false;
                                            rope.StopWinding();
                                            rope.DetachEntity(LF);
                                            rope.DetachEntity(thatVehicle);
                                            rope.Delete();
                                            return;
                                        }
                                        if (!thatVehicle.IsAnyPedBlockingVehicle(LF))
                                        {
                                            rope.StartWinding();
                                            Game.DisableControlThisFrame(0, Control.VehicleMoveUpDown);
                                        }
                                        await Delay(5);
                                    } while (!(rope.Length <= 1.9f));
                                    rope.StopWinding();
                                    rope.DetachEntity(LF);
                                    rope.DetachEntity(thatVehicle);
                                    rope.Delete();
                                    FreezeEntityPosition(LF.Handle, false);
                                    thatVehicle.AttachToFix(LF, LF.GetBoneIndex("misc_a"), thatVehicle.AttachCoords(), Vector3.Zero);
                                }
                            }

                            //Vehicle heading is the opposite of Flatbed
                            if (thatVehicle.Model != LF.Model && AC.Contains(thatVehicle.ClassType) && PP.Position.DistanceTo(thatVehicle.GetRopeHookRear()) <= 1.5f)
                            {
                                DisplayHelpTextThisFrame(String.Format(GetLangEntry("INM_FB_HOOK", "Press {0} to load {1}."), hookKey.GetButtonIcon(), thatVehicle.LocalizedName));
                                if (Game.IsControlJustPressed(0, hookKey))
                                {
                                    LF.CurrentTowingVehicle(thatVehicle);
                                    TriggerServerEvent("flatbed:SetTowingVehicle", PP.Handle, LF.Handle, thatVehicle.Handle);
                                    thatVehicle.IsPersistent = true;
                                    if (thatVehicle.IsOnAllWheels)
                                    {
                                        if (DecorGetFloat(thatVehicle.Handle, gHeightDecor) == 0f)
                                        {
                                            DecorSetFloat(thatVehicle.Handle, gHeightDecor, thatVehicle.HeightAboveGround);
                                        }
                                    }
                                    FreezeEntityPosition(LF.Handle, true);
                                    TriggerServerEvent("flatbed:AddRope", PP.Handle, LF.Handle, LV.Handle);
                                    ES = false;
                                    Rope rope = World.AddRope((RopeType)6, LF.WinchDummyPos(), Vector3.Zero, LF.WinchDummyPos().DistanceTo(thatVehicle.GetRopeHookRear()), 0.1f, false);
                                    rope.AttachEntities(LF, LF.WinchDummyPos(), thatVehicle, thatVehicle.GetRopeHookRear(), LF.WinchDummyPos().DistanceTo(thatVehicle.GetRopeHookRear()));
                                    rope.ActivatePhysics();
                                    do
                                    {
                                        if (ES == true)
                                        {
                                            ES = false;
                                            rope.StopWinding();
                                            rope.DetachEntity(LF);
                                            rope.DetachEntity(thatVehicle);
                                            rope.Delete();
                                            return;
                                        }
                                        if (!thatVehicle.IsAnyPedBlockingVehicle(LF))
                                        {
                                            rope.StartWinding();
                                            Game.DisableControlThisFrame(0, Control.VehicleMoveUpDown);
                                        }
                                        await Delay(5);
                                    } while (!(rope.Length <= 1.9f));
                                    rope.StopWinding();
                                    rope.DetachEntity(LF);
                                    rope.DetachEntity(thatVehicle);
                                    rope.Delete();
                                    FreezeEntityPosition(LF.Handle, false);
                                    thatVehicle.AttachToFix(LF, LF.GetBoneIndex("misc_a"), thatVehicle.AttachCoords(), new Vector3(0f, 0f, 180f));
                                }
                            }
                        }
                    }

                    if (World.GetDistance(LF.CurrentTowingVehicle().Position, LF.Position) >= 20f)
                    {
                        LF.CurrentTowingVehicle().IsPersistent = false;
                        LF.CurrentTowingVehicle(null);
                        TriggerServerEvent("flatbed:SetTowingVehicle", PP.Handle, LF.Handle, 0);
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"{ex.Message}{ex.StackTrace}");
            }
        }