7. Buat sistem upgrade
Yang akan kamu pelajari
Section titled “Yang akan kamu pelajari”Di akhir materi ini, kamu akan bisa:
- Menghubungkan client dan server menggunakan
RemoteFunctiondiReplicatedStorage. - Membuat
JumpServicediServerScriptServiceuntuk memproses upgrade lompatan. - Memvalidasi saldo koin di server sebelum menyetujui transaksi.
- Memotong koin dengan
PlayerData.updateValuedan memperbaruiJumpPowerkarakter. - Menjaga nilai
JumpPowertetap aktif saat karakter respawn denganCharacterAdded.
Sebelum mulai
Section titled “Sebelum mulai”- Selesaikan materi Buat checkpoint.
- Pastikan modul
LeaderboarddanPlayerDatasudah ada diServerStorage. - Kumpulkan beberapa koin saat playtest untuk mencoba pembelian upgrade.
1. Siapkan RemoteFunction di ReplicatedStorage
Section titled “1. Siapkan RemoteFunction di ReplicatedStorage”ReplicatedStorage adalah tempat menyimpan objek yang dapat diakses bersama oleh client (pemain) dan server.
- Di Explorer, arahkan kursor ke
ReplicatedStorage, lalu buat Folder bernamaInstances. - Di dalam folder
Instances, tambahkan sebuahRemoteFunction. - Ubah namanya menjadi
IncreaseJumpPowerFunction.
2. Buat JumpService di ServerScriptService
Section titled “2. Buat JumpService di ServerScriptService”- Di
ServerScriptService, buat sebuahScriptbaru. - Beri nama
JumpService. - Isi kodenya dengan:
flowchart LR classDef trigger fill:#0369a1,stroke:#38bdf8,stroke-width:2px,color:#ffffff; classDef condition fill:#b45309,stroke:#f59e0b,stroke-width:2px,color:#ffffff; classDef action fill:#047857,stroke:#10b981,stroke-width:2px,color:#ffffff; classDef finish fill:#334155,stroke:#94a3b8,stroke-width:2px,color:#ffffff;
Invoke["<b>Panggilan Remote</b><br/>OnServerInvoke"]:::trigger Check{"<b>Validasi Saldo</b><br/>Koin >= 5?"}:::condition Upgrade["<b>Terapkan Upgrade</b><br/>Potong 5 koin & Jump +30"]:::action UpdateBoard["<b>Update Skor</b><br/>Leaderboard.setStat"]:::action Success(["<b>Sukses</b><br/>return true"]):::finish Reject(["<b>Ditolak</b><br/>return false"]):::finish
Invoke --> Check Check -- "Ya" --> Upgrade --> UpdateBoard --> Success Check -- "Tidak" --> Reject- Baris 1-13: Mengambil service dan memuat objek
RemoteFunctiondariReplicatedStorage.Instances. - Baris 15-18: Menentukan parameter upgrade: kenaikan lompatan (
JUMP_POWER_INCREMENT = 30) dan harga koin (JUMP_COIN_COST = 5). - Baris 20-33: Fungsi
updateJumpPowermemperbarui nilaiJumpdiPlayerData, menerapkanhumanoid.JumpPower = newJumpPower, dan memperbarui angka diLeaderboard. - Baris 35-55:
onPurchaseJumpIncreaseadalah callback server ketika client meminta pembelian. Server mengecek apakah saldo koin cukup. Jika cukup, lompatan dinaikkan dan koin dipotong. - Baris 57-65:
onCharacterAddedmemastikan saat pemain respawn, kekuatan lompatan yang sudah dibeli tetap diterapkan ke karakter baru. - Baris 78: Menyambungkan fungsi ke
IncreaseJumpPowerFunction.OnServerInvoke.
local ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")
-- Moduleslocal Leaderboard = require(ServerStorage:WaitForChild("Leaderboard"))local PlayerData = require(ServerStorage:WaitForChild("PlayerData"))
-- Eventslocal instancesFolder = ReplicatedStorage:WaitForChild("Instances")local IncreaseJumpPowerFunction = instancesFolder:WaitForChild("IncreaseJumpPowerFunction")
local JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAMElocal COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal JUMP_POWER_INCREMENT = 30local JUMP_COIN_COST = 5
local function updateJumpPower(player, updateFunction) local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
local character = player.Character if character then local humanoid = character:FindFirstChildWhichIsA("Humanoid") if humanoid then humanoid.UseJumpPower = true humanoid.JumpPower = newJumpPower Leaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower) end endend
local function onPurchaseJumpIncrease(player) local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME) or 0 if coinAmount < JUMP_COIN_COST then return false end
-- Tambah kekuatan lompatan updateJumpPower(player, function(oldJumpPower) oldJumpPower = oldJumpPower or 50 return oldJumpPower + JUMP_POWER_INCREMENT end)
-- Potong saldo koin local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount) oldCoinAmount = oldCoinAmount or 0 return oldCoinAmount - JUMP_COIN_COST end) Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
print(player.Name .. " berhasil upgrade Jump Power seharga " .. JUMP_COIN_COST .. " koin!") return trueend
local function onCharacterAdded(player, character) local humanoid = character:WaitForChild("Humanoid", 5) local currentJumpPower = PlayerData.getValue(player, JUMP_KEY_NAME) or 50 if humanoid then humanoid.UseJumpPower = true humanoid.JumpPower = currentJumpPower Leaderboard.setStat(player, JUMP_KEY_NAME, currentJumpPower) endend
local function onPlayerAdded(player) player.CharacterAdded:Connect(function(char) onCharacterAdded(player, char) end)
if player.Character then onCharacterAdded(player, player.Character) endend
for _, player in ipairs(Players:GetPlayers()) do onPlayerAdded(player)end
IncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncreasePlayers.PlayerAdded:Connect(onPlayerAdded)Salin prompt berikut ke chat AI di Visual Studio Code (dengan Roblox Studio MCP aktif):
Buatkan Script bernama "JumpService" di ServerScriptService:- Layani RemoteFunction IncreaseJumpPowerFunction di ReplicatedStorage.Instances.- Jika koin >= 5: kurangi 5 koin, tambah Jump Power +30, dan update leaderboard.- Terapkan Jump Power saat pemain respawn.3. Trigger Pembelian dari Client / Interaksi
Section titled “3. Trigger Pembelian dari Client / Interaksi”Untuk memanggil fungsi upgrade di server dari tombol UI (ScreenGui) atau skrip interaksi client di StarterPlayerScripts, gunakan pemanggilan InvokeServer():
flowchart LR classDef trigger fill:#0369a1,stroke:#38bdf8,stroke-width:2px,color:#ffffff; classDef condition fill:#b45309,stroke:#f59e0b,stroke-width:2px,color:#ffffff; classDef action fill:#047857,stroke:#10b981,stroke-width:2px,color:#ffffff; classDef finish fill:#334155,stroke:#94a3b8,stroke-width:2px,color:#ffffff;
Call["<b>InvokeServer</b><br/>Kirim permintaan beli"]:::trigger Check{"<b>Respon Server</b><br/>Hasil boolean?"}:::condition Success(["<b>Sukses</b><br/>'Upgrade berhasil!'"]):::action Fail(["<b>Gagal</b><br/>'Koin kurang!'"]):::finish
Call --> Check Check -- "true" --> Success Check -- "false" --> Fail- Baris 1-3: Mengambil referensi service
ReplicatedStoragedan mencari objekIncreaseJumpPowerFunctiondi dalam folderInstances. - Baris 5: Memanggil server dengan method
:InvokeServer(). Client akan menunggu respon balasan (booleantrueataufalse) dari server. - Baris 7-11: Memeriksa nilai kembalian server; jika
trueberarti koin cukup dan upgrade aktif, jikafalseberarti transaksi ditolak karena saldo koin kurang.
local ReplicatedStorage = game:GetService("ReplicatedStorage")local instancesFolder = ReplicatedStorage:WaitForChild("Instances")local IncreaseJumpPowerFunction = instancesFolder:WaitForChild("IncreaseJumpPowerFunction")
local success = IncreaseJumpPowerFunction:InvokeServer()
if success then print("Upgrade berhasil dibeli!")else print("Koin tidak mencukupi!")endSalin prompt berikut ke chat AI di Visual Studio Code (dengan Roblox Studio MCP aktif):
Buatkan LocalScript bernama "UpgradeTrigger" di StarterPlayerScripts:- Panggil IncreaseJumpPowerFunction di ReplicatedStorage.Instances via InvokeServer.- Cetak status berhasil atau koin kurang ke Output.Checkpoint
Section titled “Checkpoint”Materi ini selesai jika:
IncreaseJumpPowerFunctionberada di dalamReplicatedStorage.Instances;JumpServiceaktif di dalamServerScriptService;- pembelian hanya berhasil jika koin pemain minimal
5; - saat upgrade dibeli, nilai
Coinsberkurang5danJumpbertambah30; - kekuatan lompatan tetap bertahan saat karakter respawn;
- tidak ada pesan error merah di jendela Output.
Tantangan
Section titled “Tantangan”Cobalah buat batasan maksimal level lompatan (misal maksimal JumpPower = 140) di dalam fungsi onPurchaseJumpIncrease agar karakter tidak melompat terlalu tinggi melompati seluruh peta.
Rangkuman
Section titled “Rangkuman”Kamu telah membuat sistem upgrade client-server yang aman menggunakan RemoteFunction, JumpService, dan PlayerData. Seluruh validasi ekonomi dan peningkatan stat dikontrol penuh oleh server.