Roblox Wiki

W tym poradniku (z resztą moim pierwszym) pokaże wam jak zrobić drzwi dla VIP'a, ale w troche inny sposób. Otóż nie będzie on zmieniąć swojego CanCollide (co może spowodować wpuszczenie innych graczy przez te drzwi) tylko sam gracz i drzwi nie będą ze sobą kolizji.

Polcane narzędzia:[]

Na początku robimy drzwi:

VipDoor

Następnie tworzymy skrypt (najlepiej w ServerScriptService). Zalecam zamiast kopiować go bezmyślnie, przeanalizować go i najlepiej przepisać po swojemu.

local PhysicsService = game:GetService("PhysicsService") -- Uzyskujemy service fizyki do zmiennej
local GamePassId = 0 -- id gamepassa
local VIPS = {"js6pak"} -- osoby ktorym chcemy dać vipa, a np. nie posiadają gamepassa

local IsVIP = function(player)
    if game:GetService("GamePassService"):PlayerHasPass(player, GamePassId) then 
       return true -- Jeżeli posiada gamepass, zwróć "prawda"
    end
    for i, VipName in pairs(VIPS) do
        if player.Name == VipName then
           return true -- jeżeli jego nazwa gracza znajduje się w tabeli o nazwie VIPS, zwróc "prawda"
        end
    end
    return false -- Jeżeli wszystkie powyżej zawiedzie zwróć "fałsz"
end -- Funckja pomocna do sprawdzania czy gracz jest Vipem

local VipGroup = "VipGroup" -- grupa dla graczy vip

local VipDoorGroup = "VipDoorGroup" -- grupa dla drzwi
-- dajemy nazwy grup do zmiennych, opcjonalne tylko dla wygody

PhysicsService:CreateCollisionGroup(VipGroup)

PhysicsService:CreateCollisionGroup(VipDoorGroup) -- tworzymy grupy

local VipDoor = game.Workspace.VipHouse.VIPDoor -- lokacja VipDoora
 
PhysicsService:SetPartCollisionGroup(VipDoor, VipDoorGroup) -- dodajemy VipDoora do grupy
 
PhysicsService:CollisionGroupSetCollidable(VipDoorGroup, VipGroup, false) -- Wyłączamy kolizji 2 grup (Vipów i drzwi)

local function setCollisionGroupRecursive(object, groupName)
	if object:IsA("BasePart") then
		PhysicsService:SetPartCollisionGroup(object, groupName)
	end
	for _, child in ipairs(object:GetChildren()) do
		setCollisionGroupRecursive(child, groupName)
	end
end

game.Players.PlayerAdded:Connect(function(player) -- kiedy dołączy gracz wykonaj:
    player.CharacterAdded:Connect(function(character) -- kiedy character gracza pojawi się wykonaj:
        if IsVIP(player) then -- jezeli gracz jest vipem wykonaj
           setCollisionGroupRecursive(character, VipGroup)
        end
    end)
end)

Gotowe! ;)

http://i.imgur.com/NWMvXm9l.gifv

Limity tego rozwiązania[]

  • Każdy place ma limity 32 grup (Łącznie z `defualt`).
  • `defualt` nie może zostać zabrany
  • W tym razwiązaniu działają tylko party z CanCollide
  • Nie można robić grup kolizyjnych w LocalScript (Ponieważ cały PhysicsService jest na serwerze)
  • Part może mieć tylko jedną grupe kolizyjną naraz (Jak mamy np. VIP i MVIP to trzeba stosować sztucki typu VipMvipGroup)

Bonus: CollectionService[]

A co jeżeli mam więcej drzwi? Wystarczy że je otagujemy!

Krok 1. Robimy więcej drzwi

WiecejDrzwiów

Krok 2. Tagujemy drzwi manualne, albo tak jak zalecam pluginem (patrz góra) https://i.imgur.com/lJiLODZl.gifv Krok 3. Zmieniamy troche kod:

local PhysicsService = game:GetService("PhysicsService") -- Uzyskujemy service fizyki do zmiennej
local CollectionService = game:GetService("CollectionService") -- Uzyskujemy service kolekcji do zmiennej	
local GamePassId = 1 -- id gamepassa
local VIPS = {"js6pak"} -- osoby ktorym chcemy dać vipa, a np. nie posiadają gamepassa

local IsVIP = function(player)
    if game:GetService("GamePassService"):PlayerHasPass(player, GamePassId) then return true end -- Jeżeli posiada gamepass, zwróć "prawda"

    for i, VipName in pairs(VIPS) do
        if player.Name == VipName then return true end -- jeżeli jego nazwa gracza znajduje się w tabeli o nazwie VIPS, zwróc "prawda"
    end

    return false -- Jeżeli wszystkie powyżej zawiedzie zwróć "fałsz"
end

-- Funckja pomocna do sprawdzania czy gracz jest Vipem
local VipGroup = "VipGroup" -- grupa dla graczy vip
local VipDoorGroup = "VipDoorGroup" -- grupa dla drzwi
-- dajemy nazwy grup do zmiennych, opcjonalne tylko dla wygody
PhysicsService:CreateCollisionGroup(VipGroup)
PhysicsService:CreateCollisionGroup(VipDoorGroup) -- tworzymy grupy
PhysicsService:CollisionGroupSetCollidable(VipDoorGroup, VipGroup, false) -- Wyłączamy kolizji 2 grup (Vipów i drzwi)

for i, door in pairs(CollectionService:GetTagged("VipDoor")) do
	PhysicsService:SetPartCollisionGroup(door, VipDoorGroup) -- dodajemy VipDoora do grupy
end

-- kiedy dołączy gracz wykonaj:
game.Players.PlayerAdded:Connect(function(player)
    -- kiedy character gracza pojawi się wykonaj:
    player.CharacterAdded:Connect(function(character)
        wait() -- Wait dodany tylko dlatego, że czasami nie da się nadać collision group dla meshpartów

        -- jezeli gracz jest vipem wykonaj
        if IsVIP(player) then
            -- dla kazdego dziecka i dzieci tego dziecka... wykonaj:
            for i, child in pairs(character:GetDescendants()) do
                -- jezeli dziecko jest BasePart wykonaj:
                if child:IsA("BasePart") then
                    PhysicsService:SetPartCollisionGroup(child, VipGroup) -- dodajemy Vip do grupy
                end
            end
        end
    end)
end)

Gotowe! ;)