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:[]
- https://fptje.github.io/glualint-web/ (Linter do roblox lua)
- https://www.roblox.com/library/826049158/Collision-Group-Editor (plugin do edytowania grup)
- (opcjonalnie) https://www.roblox.com/library/1486925244/Tag-Editor-Beta-Channel (plugin do edytowania tagów)
Na początku robimy drzwi:
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
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! ;)