Advertisement
AlewAlow

projectile manager 2

May 3rd, 2024 (edited)
600
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.41 KB | None | 0 0
  1. local Players = game:GetService("Players")
  2. local RunService = game:GetService("RunService")
  3. local HttpService = game:GetService("HttpService")
  4. local ReplicatedStorage = game:GetService("ReplicatedStorage")
  5. local ServerScriptService = game:GetService("ServerScriptService")
  6.  
  7. local IS_SERVER = RunService:IsServer()
  8.  
  9. local Signal = require(ReplicatedStorage.Libs.Signal)
  10. local Trove = require(ReplicatedStorage.Libs.Trove)
  11.  
  12. local DamageManager = require(ReplicatedStorage.Modules.DamageManager)
  13.  
  14. local ProjectileTypes = require(script.ProjectileTypes)
  15. local ProjectileManager = {}
  16.  
  17. ProjectileManager.MaxHitTimeDifference = 0.3
  18. ProjectileManager.MaxHitPositionDifference = 10
  19.  
  20. ProjectileManager.ProjectileAdded = Signal.new()
  21. ProjectileManager.ProjectileHits = {}
  22. ProjectileManager.Projectiles = {}
  23.  
  24. function ProjectileManager.CreateId()
  25.     return HttpService:GenerateGUID(false)
  26. end
  27.  
  28. -- the projectile properties can be different from a projectile to projectile
  29. -- but they all most of the times have a few things in common
  30. -- such as StartTime, StartCFrame or TargetPosition
  31. function ProjectileManager.CreateProjectile(projectileProperties)
  32.     if not projectileProperties.Id then
  33.         projectileProperties.Id = ProjectileManager.CreateId()
  34.     end
  35.    
  36.     if ProjectileManager.Projectiles[projectileProperties.Id] then
  37.         return nil
  38.     end
  39.    
  40.     local projectileClass = ProjectileTypes[projectileProperties.Type]
  41.     local projectile = projectileClass.new(projectileProperties)
  42.    
  43.     projectile.Removing:Connect(function()
  44.         ProjectileManager.Projectiles[projectileProperties.Id] = nil
  45.     end)
  46.    
  47.     projectile.Hit:Connect(function(hit)
  48.         if IS_SERVER then
  49.             if projectileProperties.Shooter then
  50.                 ProjectileManager.ProjectileHits[projectileProperties.Id] = {
  51.                     Hit = hit,
  52.                     HitTime = workspace:GetServerTimeNow(),
  53.                     HitPosition = projectile.Position,
  54.                     Properties = projectileProperties,
  55.                 }
  56.             end
  57.         elseif projectileProperties.Shooter == Players.LocalPlayer then
  58.             script.ProjectileHit:FireServer(
  59.                 projectileProperties.Id,
  60.                 projectile.Position,
  61.                 workspace:GetServerTimeNow(),
  62.                 hit
  63.             )
  64.         end
  65.     end)
  66.    
  67.     ProjectileManager.ProjectileAdded:Fire(projectile)
  68.     ProjectileManager.Projectiles[projectileProperties.Id] = projectile
  69.    
  70.     if IS_SERVER then
  71.         script.ProjectileCreated:FireAllClients(projectileProperties)
  72.     end
  73.    
  74.     return projectile
  75. end
  76.  
  77. if IS_SERVER then
  78.     script.GetProjectiles.OnServerInvoke = function(player)
  79.         local projectilesProperties = {}
  80.        
  81.         for _, projectile in ProjectileManager.Projectiles do
  82.             table.insert(projectilesProperties, projectile.Properties)
  83.         end
  84.        
  85.         return projectilesProperties
  86.     end
  87.    
  88.     script.ProjectileHit.OnServerEvent:Connect(function(player, id, hitPosition, hitTime, hit)
  89.         local hitData = ProjectileManager.ProjectileHits[id]
  90.        
  91.         if
  92.             not hitData
  93.             or hitData.Properties.Shooter ~= player
  94.             or hitData.Hit ~= hit
  95.         then
  96.             return
  97.         end
  98.        
  99.         local timeDifference = math.abs(hitData.HitTime - hitTime)
  100.         if timeDifference > ProjectileManager.MaxHitTimeDifference then
  101.             return
  102.         end
  103.        
  104.         local positionDifference = (hitPosition - hitData.HitPosition).Magnitude
  105.         if positionDifference > ProjectileManager.MaxHitPositionDifference then
  106.             return
  107.         end
  108.        
  109.         DamageManager.ApplyDamage(
  110.             hitData.Properties.Damage,
  111.             hit,
  112.             player
  113.         )
  114.     end)
  115. else
  116.     script.ProjectileCreated.OnClientEvent:Connect(ProjectileManager.CreateProjectile)
  117. end
  118.  
  119. return ProjectileManager
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131. local RunService = game:GetService("RunService")
  132. local ReplicatedStorage = game:GetService("ReplicatedStorage")
  133.  
  134. local Signal = require(ReplicatedStorage.Libs.Signal)
  135. local Trove = require(ReplicatedStorage.Libs.Trove)
  136.  
  137. local IS_CLIENT = RunService:IsClient()
  138.  
  139. local Bullet = {}
  140. Bullet.__index = Bullet
  141.  
  142. local function createInstance()
  143.     local instance = script.BulletTemplate:Clone()
  144.     instance.Name = "sigma"
  145.     instance.Parent = workspace
  146.     return instance
  147. end
  148.  
  149. function Bullet.new(projectileProperties)
  150.     local self = setmetatable({}, Bullet)
  151.     self.Properties = projectileProperties
  152.     self.Position = projectileProperties.StartPosition
  153.     self.StartTime = projectileProperties.StartTime or workspace:GetServerTimeNow()
  154.     self.Params = projectileProperties.Params or RaycastParams.new()
  155.     self.Speed = projectileProperties.Speed or 50
  156.    
  157.     if IS_CLIENT then
  158.         self.Instance = createInstance()
  159.     end
  160.    
  161.     self.Hit = Signal.new()
  162.     self.Removing = Signal.new()
  163.     self.Removing:Connect(function()
  164.         self.Instance:Destroy()
  165.     end)
  166.    
  167.     local distance =
  168.         (projectileProperties.StartPosition
  169.         - projectileProperties.TargetPosition).Magnitude
  170.    
  171.     self.Lifetime = distance / self.Speed
  172.    
  173.     return self
  174. end
  175.  
  176. function Bullet:Update(_deltaTime)
  177.     local timePassed = workspace:GetServerTimeNow() - self.StartTime
  178.     local timePercentage = timePassed / self.Lifetime
  179.     if timePercentage > 1 then
  180.         self.Removing:Fire()
  181.         return
  182.     end
  183.    
  184.     local lastPosition = self.Position
  185.     local currentPosition = self.Properties.StartPosition:Lerp(self.Properties.TargetPosition, timePercentage)
  186.     local direction = currentPosition - lastPosition
  187.     local result = workspace:Raycast(
  188.         lastPosition,
  189.         direction,
  190.         self.Params
  191.     )
  192.    
  193.     if result then
  194.         self.Position = result.Position
  195.         self.Hit:Fire(result.Instance)
  196.         self.Removing:Fire()
  197.         return
  198.     end
  199.    
  200.     self.Position = lastPosition
  201.    
  202.     if self.Instance then
  203.         self.Instance.Position = self.Position
  204.     end
  205. end
  206.  
  207. return Bullet
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement