Advertisement
TaylorsRus

CharacterService

Mar 17th, 2024
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.61 KB | None | 0 0
  1. -- [[ Services ]] --
  2. local ReplicatedStorage = game:GetService('ReplicatedStorage');
  3. local CollectionService = game:GetService("CollectionService")
  4.  
  5. -- [[ Resources ]] --
  6. local CardinalSystem = require(ReplicatedStorage:WaitForChild('CardinalSystem'));
  7.  
  8. -- [[ Variables ]] --
  9. local Assets = ReplicatedStorage:FindFirstChild("Assets");
  10. assert(Assets, "Assets not found.");
  11. local Outfits = Assets:FindFirstChild("Outfits");
  12. assert(Outfits, "Outfits couldn't be found.");
  13. local Katana = Assets:FindFirstChild("Katana");
  14. local Motors = Katana and Katana:FindFirstChild("Motors");
  15. assert(Motors, "Motors couldn't be found.");
  16. local Models = Katana and Katana:FindFirstChild("Models");
  17. assert(Models, "Katana Models couldn't be found.");
  18.  
  19. -- [[ Service ]] --
  20. local CharacterService = CardinalSystem:CreateService({
  21.     Name = 'CharacterService';
  22. });
  23.  
  24. local function ToggleAnchor(Character : Model, Bool : boolean)
  25.     for _,Basepart in pairs(Character:GetDescendants()) do
  26.         if Basepart:IsA("BasePart") then
  27.             Basepart.Anchored = Bool
  28.         end
  29.     end
  30. end
  31.  
  32. function CharacterService:OnInit()
  33.     self.Services = {
  34.         DatastoreService = CardinalSystem:GetService('DatastoreService');
  35.         BreathingService = CardinalSystem:GetService("BreathingService")
  36.     };
  37.  
  38.     self.Resources = {
  39.         StatusHandler = CardinalSystem:LoadLibrary('StatusHandler');
  40.         LimbsHandler = CardinalSystem:LoadLibrary("Limbs");
  41.         Janitor = CardinalSystem:LoadLibrary("Janitor");
  42.     };
  43.  
  44.     self.Clothings = {};
  45.     self.StatusHandlers = {};
  46.     self.Limbs = {};
  47. end
  48.  
  49. local _BaseStatus = {
  50.     {
  51.         Type = "Breathe",
  52.         Value = 0;
  53.         Min = 0;
  54.         Max = 100;
  55.     };
  56. }
  57.  
  58. function CharacterService:AddStatusHandler(Character: Model)
  59.     local StatusHandler = self.Resources.StatusHandler;
  60.     local LimbsHandler = self.Resources.LimbsHandler;
  61.     local Janitor = self.Resources.Janitor;
  62.  
  63.     local Handler = StatusHandler.new(Character);
  64.     local Limbs = LimbsHandler.new(Character);
  65.  
  66.     local _Janitor = Janitor.new();
  67.  
  68.     _Janitor:Add(function()
  69.         Handler:Destroy();
  70.         Limbs:Destroy();
  71.         self.Limbs[Character] = nil;
  72.         self.StatusHandlers[Character] = nil;
  73.     end, true);
  74.  
  75.     _Janitor:LinkToInstance(Character);
  76.     Character.Humanoid.Died:Connect(function()
  77.         Character:BreakJoints()
  78.         _Janitor:Cleanup()
  79.     end)
  80.  
  81.     self.StatusHandlers[Character] = Handler;
  82.     self.Limbs[Character] = Limbs;
  83.  
  84.     for _, Table in pairs(_BaseStatus) do
  85.         Handler:AddStatus(Table)
  86.     end
  87.    
  88.     self.Services.BreathingService:InitPlayer(Character, Handler)
  89.    
  90.     return Handler;
  91. end
  92.  
  93. function CharacterService:HandleRagdoll(Character : Model, Humanoid : Humanoid)
  94.     local Janitor = self.Resources.Janitor
  95.  
  96.     local _Janitor = Janitor.new()
  97.     print("HandleRagdoll")
  98.  
  99.     _Janitor:Add(Humanoid:GetPropertyChangedSignal("Health"):Connect(function()
  100.         local NewHealth = math.ceil(Humanoid.Health)
  101.         if CollectionService:HasTag(Character, "Ragdolled") then
  102.             if NewHealth >= 20 then
  103.                 CollectionService:RemoveTag(Character, "Ragdolled")
  104.                 ToggleAnchor(Character, false)
  105.                 task.wait(.1)
  106.                 Humanoid:ChangeState(Enum.HumanoidStateType.GettingUp)
  107.             end
  108.         else
  109.             if NewHealth <= 0 and not CollectionService:HasTag(Character, "Ragdolled") then
  110.                 print("Activating ragdoll")
  111.                 task.wait(.1)
  112.                 CollectionService:AddTag(Character, "Ragdolled")
  113.                 Humanoid:ChangeState(Enum.HumanoidStateType.Ragdoll)
  114.                 --Character.HumanoidRootPart:ApplyAngularImpulse(Vector3.new(-90, 0, 0))
  115.             end
  116.         end
  117.  
  118.     end), "Disconnect")
  119.     _Janitor:LinkToInstance(Character)
  120.  
  121.     Humanoid.BreakJointsOnDeath = false
  122.     Humanoid:SetStateEnabled(Enum.HumanoidStateType.Ragdoll, true)
  123.     Humanoid:SetStateEnabled(Enum.HumanoidStateType.Dead, false)
  124. end
  125.  
  126. local function Weld(P0, P1, RefPart) -- P0 for Character Part, P1 For new part
  127.     P1.CFrame = P0.CFrame * (RefPart.CFrame:Inverse() * P1.CFrame)
  128.    
  129.     local WeldConst = Instance.new("WeldConstraint", P1)
  130.     WeldConst.Part0 = P0
  131.     WeldConst.Part1 = P1
  132.     return WeldConst
  133. end
  134.  
  135. function CharacterService:SetupHaori(Character, Style: string)
  136.     local HaoriModel = Assets.Models.Haoris:FindFirstChild("Haori "..Style)
  137.     local HaoriRef = HaoriModel
  138.     if HaoriModel then
  139.         local StoreFolder = Instance.new("Folder", Character); StoreFolder.Name = "Haori"
  140.         HaoriModel = HaoriModel.Haori:Clone()
  141.         HaoriModel.Parent = Character
  142.         local function SetupBaseparts()
  143.             for _, Basepart in pairs(HaoriModel:GetChildren()) do
  144.                 if Basepart:IsA("BasePart") then
  145.                     Basepart.Parent = StoreFolder
  146.                     Weld(Character:FindFirstChild(Basepart.Name), Basepart, HaoriRef.Rig:FindFirstChild(Basepart.Name))
  147.                 end
  148.             end
  149.         end
  150.         SetupBaseparts()
  151.     end
  152. end
  153.  
  154. function CharacterService:SetupUniform(Character, Style: string)
  155.     local UniModel = Assets.Models.Uniforms:FindFirstChild(Style)
  156.     local ReferenceModel = UniModel
  157.     if UniModel then
  158.         local StoreFolder = Instance.new("Folder", Character); StoreFolder.Name = Style
  159.         UniModel = UniModel.Cloth:Clone()
  160.         UniModel.Parent = Character
  161.         local function SetupBaseparts()
  162.             for _, Basepart in pairs(UniModel:GetChildren()) do
  163.                 if Basepart:IsA("BasePart") then
  164.                     Basepart.Parent = StoreFolder
  165.                     Weld(Character:FindFirstChild(Basepart.Name), Basepart, ReferenceModel.Rig:FindFirstChild(Basepart.Name))
  166.                 end
  167.             end
  168.         end
  169.         SetupBaseparts()
  170.     end
  171. end
  172.  
  173. function CharacterService:UpdateClothing(Player: Player)
  174.     local DatastoreService = self.Services.DatastoreService;
  175.  
  176.     if not DatastoreService then
  177.         return
  178.     end
  179.  
  180.     local Clothing = self.Clothings[Player];
  181.     if not Clothing then
  182.         repeat
  183.             Clothing = self.Clothings[Player];
  184.             task.wait();
  185.         until Clothing;
  186.     end
  187.  
  188.     local Shirt = Clothing.Shirt;
  189.     local Pants = Clothing.Pants;
  190.  
  191.     DatastoreService:GetPlayerProfile(Player):andThen(function(Profile)
  192.         local Data = Profile:GetData();
  193.         if not Data then return end
  194.  
  195.         local Success, Selected = pcall(function()
  196.             return Outfits[tostring(Data.Customization.Shirt.Id)].Shirt;
  197.         end)
  198.  
  199.         if Success and Shirt and Selected then
  200.             Shirt.ShirtTemplate = Selected.ShirtTemplate;
  201.         end
  202.  
  203.         Success, Selected = pcall(function()
  204.             return Outfits[tostring(Data.Customization.Pants.Id)].Pants;
  205.         end)
  206.  
  207.         if Success and Pants and Selected then
  208.             Pants.PantsTemplate = Selected.PantsTemplate;
  209.         end
  210.        
  211.        
  212.     end)
  213. end
  214.  
  215. function CharacterService:OnCharacterAdded(Character: Model, Player: Player)
  216.     local DatastoreService = self.Services.DatastoreService;
  217.  
  218.     if not DatastoreService then
  219.         return
  220.     end
  221.  
  222.     local Hrp = Character:WaitForChild("HumanoidRootPart");
  223.     Character.Parent = workspace:FindFirstChild("Living");
  224.  
  225.     DatastoreService:GetPlayerProfile(Player):andThen(function(Profile)
  226.         local Data = Profile:GetData();
  227.         if not Data then return end
  228.  
  229.         local Location = Data.Stats.Location;
  230.         Hrp.CFrame = CFrame.new(Location.X, Location.Y, Location.Z);
  231.  
  232.         if Data.Stats.Race == "Human" then
  233.             local Torso = Character:FindFirstChild("Torso");
  234.             local Folder = Models:FindFirstChild(tostring(Data.Customization.Nichirin.Id));
  235.             if Torso and Folder then
  236.                 local Weapon = Folder:FindFirstChild("Weapon");
  237.                 if Weapon then
  238.                     local Motor = Motors.Handle:Clone();
  239.                     Motor.Part0 = Character["Right Arm"];
  240.                     Motor.Enabled = false;
  241.  
  242.                     Weapon = Weapon:Clone();
  243.                     Motor.Part1 = Weapon.PrimaryPart;
  244.                     Motor.Parent = Weapon.Welds;
  245.                     Weapon.Parent = Character;
  246.                 end
  247.  
  248.                 local Sheathe = Folder:FindFirstChild("Sheathe");
  249.                 if Sheathe then
  250.                     local Motor = Motors.Sheathe:Clone();
  251.                     Motor.Part0 = Torso;
  252.  
  253.                     local Motor1 = Motors.DefaultSheathe:Clone();
  254.  
  255.                     Sheathe = Sheathe:Clone();
  256.                     Motor.Part1 = Sheathe.PrimaryPart;
  257.                     Motor1.Part0 = Sheathe.PrimaryPart;
  258.                     Motor1.Part1 = Character:FindFirstChild("Weapon") and Character.Weapon.PrimaryPart;
  259.                     Motor.Parent = Sheathe.Welds;
  260.                     Motor1.Parent = Sheathe.Welds;
  261.  
  262.                     Motor.Enabled = true;
  263.                     Motor1.Enabled = true;
  264.  
  265.                     Sheathe.Parent = Character;
  266.                 end
  267.             end
  268.         end
  269.     end)
  270.  
  271.     local Shirt = Character:FindFirstChild("Shirt");
  272.     local Pants = Character:FindFirstChild("Pants");
  273.  
  274.     if not Shirt then
  275.         Shirt = Instance.new("Shirt");
  276.         Shirt.Name = "Shirt";
  277.         Shirt.Parent = Character;
  278.     end
  279.  
  280.     if not Pants then
  281.         Pants = Instance.new("Pants");
  282.         Shirt.Name = "Pants";
  283.         Pants.Parent = Character;
  284.     end
  285.  
  286.     self.Clothings[Player] = {
  287.         Shirt = Shirt;
  288.         Pants = Pants;
  289.     }
  290.  
  291.     self:UpdateClothing(Player);
  292.     self:AddStatusHandler(Character);
  293.    
  294.     self:SetupUniform(Character, "Slayers")
  295.    
  296.     local Humanoid = Character:WaitForChild("Humanoid",20)
  297.     self:HandleRagdoll(Character, Humanoid)
  298. end
  299.  
  300. function CharacterService:OnHeartbeat(dt)
  301.     for _, Handler in pairs(self.StatusHandlers) do
  302.         task.spawn(Handler._OnHeartbeat, Handler, dt);
  303.     end
  304. end
  305.  
  306. return CharacterService;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement