Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Скрипт занимается стрельбой на стороне игрока
- -- Скорость снаряда
- local PROJECTILE_SPEED = 80
- -- Как часто можно стрелять снарядом (кулдаун)
- local LAUNCH_COOLDOWN = 0.2
- -- Расстояние спавна снаряда относительно модели корабля
- local PROJECTILE_OFFSET = 5
- -- Клавиша, отвечающая за стрельбу (пробел).
- local ATTACK_KEY = Enum.KeyCode.Space
- -- Переменные для сервисов Роблокса
- local ContextActionService = game:GetService("ContextActionService")
- local Players = game:GetService("Players")
- local ReplicatedStorage = game:GetService("ReplicatedStorage")
- -- Переменные для RemoteEvents и Functions
- local launchProjectile = ReplicatedStorage:WaitForChild("LaunchProjectile")
- local destroyProjectile = ReplicatedStorage:WaitForChild("DestroyProjectile")
- local destroyEnemy = ReplicatedStorage:WaitForChild("DestroyEnemy")
- local pingChecker = ReplicatedStorage:WaitForChild("Ping")
- -- Переменная для снаряда
- local projectileTemplate = ReplicatedStorage:WaitForChild("Projectile")
- -- Переменная для локального игрока
- local player = Players.LocalPlayer
- local canLaunch = true
- -- Функция запуска снаряда
- local function onLaunch()
- -- Если персонаж в игре, куллдаун прошёл, персонаж на поле, то
- if player.Character and canLaunch and player.Character.Parent == workspace then
- -- Сброс кулдауна
- canLaunch = false
- spawn(function()
- wait(LAUNCH_COOLDOWN)
- canLaunch = true
- end)
- -- Создаём клон снаряда
- local projectile = projectileTemplate:Clone()
- -- Получаем пространственную матрицу корабля
- local playerCFrame = player.Character.PrimaryPart.CFrame
- -- Домножаем вектор взгляда на (1,1,1), если изначально Mesh направлен как нужно.
- local direction = playerCFrame.LookVector * Vector3.new(-1,1,-1)
- -- Сдвигаем спавн снаряда дальше от центра объекта на величину PROJECTILE_OFFSET
- projectile.Position = playerCFrame.Position + direction * PROJECTILE_OFFSET
- -- Задаём вектор скорости снаряда
- projectile.Velocity = direction * PROJECTILE_SPEED
- -- Добавляем противосилу (F = m*g), чтобы снаряд левитировал по поверхности
- local mass = projectile:GetMass()
- projectile.VectorForce.Force = Vector3.new(0, 1, 0) * mass * game.Workspace.Gravity
- -- Переносим снаряд на игровое поле
- projectile.Parent = game.Workspace
- -- Передаём серверу информацию, чтобы он создал копию снаряда и отобразил её на экране
- --local serverProjectile = launchProjectile:InvokeServer(projectile.Position, projectile.Velocity)
- -- Скрываем копию снаряда на сервере от игрока
- --serverProjectile.LocalTransparencyModifier = 1
- -- "Сцепляем" функцию касания со снарядом
- projectile.Touched:Connect(function(other)
- -- Проверяем столкновение с EnemyShip и стенами
- if other.Name == "EnemyShip" or other.Name == "Wall" then
- -- Если столкновение было - удаляем снаряд у игрока и на сервере
- projectile:Destroy()
- --destroyProjectile:FireServer(serverProjectile)
- -- Если снаряд попал во врага, то удаляем и этот объект
- if other.Name == "EnemyShip" then
- destroyEnemy:FireServer(other)
- other:Destroy()
- end
- end
- end)
- end
- end
- pingChecker.OnClientInvoke = function() end
- ContextActionService:BindAction("Launch", onLaunch, false, ATTACK_KEY)
Advertisement
Add Comment
Please, Sign In to add comment