Qwerty Labs / Henry / Roblox Studio

Fix it. Name it.
Dismantle.

First, two small mistakes in the code we supplied last week. Next, give your arena proper names. Then we can get back to the interesting bit: making Dismantle work.

YOUR EXISTING PROJECT2 FIXESCLIENT → SERVER → SLASH

Start with your current Roblox Studio place. Save a separate working copy first. We are fixing a couple of lines, not rebuilding Phase 1.

How we'll use the specs from now on

You're building the game, not finishing another worksheet. Each new gameplay feature will identify HENRY'S SPEC (your existing decision) and WORKING DEFAULT (a value or rule we've supplied so you can test it). Change working defaults when you can see how they affect the game. We'll keep gameplay settings together instead of burying numbers throughout scripts.

HENRY'S SPEC · Dismantle: key 1 is the current control we're testing; the individual input field still needs to be marked final. Current values: 10 damage, 20 CE, 8-second cooldown, 0.6-second windup, 60-stud range and 1.2-second stun; blockable, dodgeable and interruptible; white-and-black slash. These are not implemented by Steps 01–08 yet.

WORKING DEFAULT · visual preview: the temporary Part sizes, animation length and one-second cleanup are just starting choices for testing appearance. They do not set damage, hitbox size, windup or cooldown.

01

Our two mistakes. Your two fixes.

Fix A — remove one stray 1

Explorer → ServerScriptService → Services → RespawnService

  1. Open RespawnService (a ModuleScript).
  2. Find print(player.Name, "spawn protection ended") (around line 54 in the version we checked).
  3. There is an extra 1 immediately before that print. Delete only the extra 1. Keep the print line.
The correct line
print(player.Name, "spawn protection ended")

Fix B — make the 1 key work

Explorer → StarterPlayer → StarterPlayerScripts → CombatClient

Two different starting files: Henry's CursedPandemonium_phase1.rbxl already has the Dismantle keypress code, but it's wrongly placed inside F/Block. The Qwerty reference file dcPhase1.rbxl has no Dismantle keypress code yet. They need different fixes.

  1. Open CombatClient (a LocalScript). Find UserInputService.InputBegan:Connect(function(input, gameProcessed).
  2. Find the F = Block section. Look for if input.KeyCode == Enum.KeyCode.One then anywhere in this same InputBegan function.
  3. Henry: If the 1-key block is inside the F block, move that existing block below F's closing end. Don't make a second copy.
  4. Reference file / other place with no 1 block: add only the four-line 1-key block from the example below, after F's closing end but before the existing InputBegan closing end).
  5. If a 1-key block already exists after F and inside InputBegan, leave it alone. Do not paste duplicate code.
REFERENCE · compare this area, don't paste a second F branch
-- Hold F = Block
if input.KeyCode == Enum.KeyCode.F then
    combatAction:FireServer("BlockStart")
end

-- Press 1 = Dismantle
if input.KeyCode == Enum.KeyCode.One then
    print("Dismantle request sent")
    combatAction:FireServer("Dismantle")
end

Important: Both if blocks must stay inside the original InputBegan function, above its end). Keep your Q, R, M1 and F release code intact. If your current F section contains extra logic, keep it; just move the Dismantle branch outside it.

Quick check Use Play (F5), not Run. Click inside the playing game, press 1 once and read Output. You must see Dismantle request sent (Client · CombatClient). No server print is expected until Step 04. No new red script errors.
02

Give your arena real names.

While comparing your project with the reference version, we noticed four objects all called SpawnLocation, plus other map objects with generic names like Part.

Why it matters: a team can't build or debug a game if everyone has to click through a pile of anonymous objects to find the right wall or spawn. Good names tell the next developer what each thing is and does. They also make your own scripts much easier to work with.

  1. Open Explorer → Workspace. Click each spawn and see where it is in the arena.
  2. Rename the four existing spawns Spawn1, Spawn2, Spawn3, Spawn4 — the convention in the reference project. Pick a consistent order you can explain.
  3. Find the generic arena Parts. Rename each for its actual job and position. For example: Arena_NorthWall, Arena_SouthWall, Arena_EastWall, Arena_WestWall, or Arena_Floor if it's genuinely the floor.
  4. There are five additional map parts in the version we compared. Make sure all five have useful, unique names, not just the walls.

Rename only. Don't delete, move, resize or change the object type. A SpawnLocation stays a SpawnLocation. Don't rename any scripts, RemoteEvents or service folders.

Quick check Look at Workspace in Explorer. Can another developer tell which spawn, wall or floor object they're looking at without clicking around to investigate?
03

Check the original game before adding anything.

Stop any old playtest. Save your project. Choose Play (F5), not Run (F8). Run starts a simulation without your character, so pressing keys will not test the same thing.

  1. In Studio, open Output (from the Window menu or Script tab). Clear old messages if useful. Make sure the Output text filter is empty.
  2. Click inside the live game viewport to give it keyboard focus. Don't leave the cursor inside the code editor or chat.
  3. Press 1 once. Look for Dismantle request sent, marked Client · CombatClient.
  4. Try Q Dash, R Dodge and F Block (hold and release). Check HP/CE HUD. For a complete baseline, use a two-player Studio test for M1 damage and respawn.
  5. Check Output for red errors from your game scripts.
A normal message: qwertykidsDC spawn protection ended — Server — RespawnService:53 only means spawn protection ended. It is not proof that Dismantle was received.
Pass: The client message appears when you press 1, the original controls still work and no new script errors appear. No server Dismantle message is expected yet.
If pressing 1 produces no client message
  1. Confirm you're in Play with an avatar and in Client mode (not Server mode).
  2. Click the 3D game view, then press the number 1 along the top row of the keyboard. Make sure chat isn't open.
  3. Make sure Output isn't filtered to Server only.
  4. Open StarterPlayer → StarterPlayerScripts → CombatClient. Check that the Dismantle if is inside InputBegan but after F's closing end. Do not add a second copy.
  5. Check the first red error, if any. Stop here until the client print works.
04

Does the server hear Dismantle?

First check the client. Only continue if Step 03 showed Dismantle request sent when you pressed 1. That message comes from CombatClient, not RespawnService.

A. Add one small server branch (if it is missing)

Explorer → ServerScriptService → CombatActionHandler · Script

  1. Stop the playtest and open CombatActionHandler.
  2. Find the existing combatAction.OnServerEvent:Connect(function(player, action) handler and its if action == "M1" then chain.
  3. Look below BlockEnd. If you already added the Dismantle branch, don't add it again.
  4. Otherwise insert only these two lines after the BlockEnd action, before the matching final end of the action chain.
COPY THESE TWO LINES ONLY (if missing)
elseif action == "Dismantle" then
    print("[Server] Received Dismantle from", player.Name)

Check the ending: the bottom of your existing handler should look like this. For comparison only—do not paste a second BlockEnd branch.

COMPARE THE FINAL LINES · not a second code insertion
elseif action == "BlockEnd" then
    CombatService.SetBlocking(player, false)

elseif action == "Dismantle" then
    print("[Server] Received Dismantle from", player.Name)
end

end)

The first end closes the action chain; end) closes OnServerEvent:Connect(...). Keep all existing M1, Dash, Dodge and Block logic above these lines. No new RemoteEvent and no new listener.

B. Test the client and server, one press

  1. Press Play (F5). Confirm your avatar appears. Stay in Client mode.
  2. Open Output. Clear previous messages. Make sure there is no text or context filter hiding Client or Server messages.
  3. Click in the live 3D game, then press 1 once.
  4. Find both of the following messages. Roblox may add a timestamp, script name and line number.

1 · Client (CombatClient)

Dismantle request sent

2 · Server (CombatActionHandler)

[Server] Received Dismantle from qwertykidsDC

The username will be your own if you're not logged in as qwertykidsDC. The [Server] inside the message is text from our print; Roblox also labels where that message came from.

Pass: Both Dismantle messages appear after one press of 1, with no new red errors. Only then go to Step 05.
Only one message—or only “spawn protection ended”?
  • Only “spawn protection ended”: that's normal respawn output, not a Dismantle test result. Did you press 1 after clicking the live game? Check the Client message first.
  • No client message: return to Step 03; check game focus, Client mode, the InputBegan branch and Output filters.
  • Client yes, server no: check that CombatActionHandler is a normal Script, enabled and inside ServerScriptService; that it listens to ReplicatedStorage → Remotes → CombatAction; and that your Dismantle branch is inside its existing action chain. Check the first red Output error.
  • “Expected 'end'”: undo the last insertion. Confirm the two final closings are end and end), not two plain ends.

Don't progress while a check fails. A missing print doesn't mean the code above it worked.

05

Now make a slash appear.

Only start if you personally saw both Dismantle messages in Step 04. This is a visual-only preview: no damage, hitbox, CE cost or cooldown.

  1. Stop the playtest. Open ServerScriptService → CombatActionHandler.
  2. Find the elseif action == "Dismantle" then branch you just tested.
  3. Add the following inside this branch, directly under print("[Server] Received Dismantle from", player.Name) and before the action chain's closing end.
  4. Keep that original server print. Don't replace the entire handler or create a new script.
ADD UNDER THE EXISTING SERVER PRINT
local character = player.Character
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
local root = character and character:FindFirstChild("HumanoidRootPart")

if humanoid and humanoid.Health > 0 and root then
    local slash = Instance.new("Part")
    slash.Name = "DismantlePreview"
    slash.Anchored = true
    slash.CanCollide = false
    slash.CanTouch = false
    slash.CanQuery = false
    slash.Material = Enum.Material.Neon
    slash.Color = Color3.fromRGB(245, 245, 255)
    slash.Size = Vector3.new(6, 2, 0.2)
    slash.CFrame = root.CFrame
        * CFrame.new(0, 1, -5)
        * CFrame.Angles(0, 0, math.rad(25))
    slash.Parent = workspace
    print("[Server] DismantlePreview created")
    game:GetService("Debris"):AddItem(slash, 1)
end

Don't miss this: The code has one end closing its own if humanoid ... then. Keep the original end and end) below it. It is not a replacement for either of them.

Test the visible result

  1. Press Play (F5), click inside the live game and face an open area.
  2. Press 1 once. Look in front of your character for a pale angled part that appears for one second.
  3. Output should show the Client message, the Server received message, and [Server] DismantlePreview created. No red script errors.
  4. Check Q, R and F still work. Save the Roblox place when finished.
Pass: You see the slash and all three Output messages after pressing 1. It disappears by itself. That is a working prototype—not the finished attack.
What if you don't see it?
  • No Dismantle client/server prints: go back to Step 04.
  • Server received but no “created”: check the first red error and confirm the new code is inside the Dismantle branch. Make sure your character is alive and has a HumanoidRootPart.
  • “Created” prints but no slash is visible: face clear space, press 1 again and look ahead of the avatar. In Server-mode Explorer during the playtest, check Workspace for DismantlePreview while the one-second effect exists.
06

Make the slash move.

Start here only if Step 05 worked: pressing 1 produced [Server] DismantlePreview created and you saw the pale slash. Save your working Roblox place before changing anything.

Right now, the slash appears like a sign and vanishes. Let's make it grow and fade. Roblox's TweenService animates properties for us.

WORKING DEFAULT: the 0.45 seconds in TweenInfo is how long the visual animation lasts. Try 0.25 for a snappier slash or 0.7 for a slower one. This is not the 0.6-second ability windup Henry specified; that comes later.

  1. Stop the playtest. Open ServerScriptService → CombatActionHandler (a Script).
  2. Find elseif action == "Dismantle" then. Inside that branch, find these two existing lines near its bottom:
FIND THESE TWO LINES (don't delete either)
print("[Server] DismantlePreview created")
game:GetService("Debris"):AddItem(slash, 1)
  1. Insert this entire snippet between those two lines. Do not replace either one. Keep it inside if humanoid and humanoid.Health > 0 and root then.
INSERT BETWEEN THE PRINT AND DEBRIS LINES
game:GetService("TweenService"):Create(
    slash,
    TweenInfo.new(0.45, Enum.EasingStyle.Quad),
    {
        Size = Vector3.new(9, 3, 0.2),
        Transparency = 1
    }
):Play()

No other changes. In particular, keep game:GetService("Debris"):AddItem(slash, 1); it still cleans up the Part.

Test 06 · One growing slash

  1. Press Play (F5), click the live game viewport, face some empty space and press 1 once.
  2. The pale slash should now expand and fade instead of staying still for a full second. Cleanup still happens automatically.
  3. Output should still show Dismantle request sent, [Server] Received Dismantle from ... and [Server] DismantlePreview created. There should be no new red script errors.
Pass: The one slash expands and fades, all three messages appear, and Q/R/F are unchanged.
Still looks static, or isn't visible?

Confirm the new code is between the print and Debris lines, and that you haven't removed ):Play(). Check the first red Output error before continuing. The animation lasts about half a second: press 1 a couple of times, separately, if you missed it.

07

Add a second slash stroke.

Let's make the visual more distinctive: one bright slash and one black crossing stroke. This changes only the appearance, not the attack rules. HENRY'S SPEC: a white-and-black slash. WORKING DEFAULT: the second stroke's angle, width and animation timing. Change those and see how the effect feels.

  1. Stop the playtest. Open the same CombatActionHandler Script.
  2. Find the Step 06 animation, which ends with ):Play().
  3. Directly after that ):Play() but before game:GetService("Debris"):AddItem(slash, 1), paste the snippet below. Keep the original pale slash and its cleanup.
INSERT AFTER THE WHITE SLASH TWEEN, BEFORE WHITE DEBRIS
local darkSlash = slash:Clone()
darkSlash.Name = "DismantleDarkPreview"
darkSlash.Color = Color3.fromRGB(16, 16, 22)
darkSlash.Transparency = 0.1
darkSlash.Size = Vector3.new(5, 1.5, 0.2)
darkSlash.CFrame = slash.CFrame
    * CFrame.Angles(0, 0, math.rad(-55))
    * CFrame.new(0, 0, -0.35)
darkSlash.Parent = workspace

game:GetService("TweenService"):Create(
    darkSlash,
    TweenInfo.new(0.45, Enum.EasingStyle.Quad),
    {
        Size = Vector3.new(7, 2.2, 0.2),
        Transparency = 1
    }
):Play()

game:GetService("Debris"):AddItem(darkSlash, 1)
print("[Server] DismantleDarkPreview created")

Important: The darkSlash block still belongs inside the same if humanoid ... then. Do not paste below its closing end, and don't duplicate any elseif or event handler.

Test 07 · Two visible strokes

  1. Press Play (F5), click inside the playing game, face open space and press 1 once.
  2. You should see two crossing strokes expand and fade. Both clean up automatically.
  3. Output should include the previous three messages plus [Server] DismantleDarkPreview created. Check for new red script errors.
Pass: Both strokes appear and fade; all four Dismantle messages appear; no new red errors.
Only one stroke?

First look for [Server] DismantleDarkPreview created. If missing, inspect the first red error and check that the new code is inside the Dismantle branch. If the message appears, try rotating the character and pressing 1 again; the dark stroke is a quick, narrower second flash.

08

Prove it works for two players.

No more new code in this step. Roblox is multiplayer: a visual that works for one client isn't yet a tested multiplayer effect.

HENRY'S GAME RULE: the server validates actions. A shared visual created by the server should be visible to both players. WORKING DEFAULT: two players for this quick test; the game can be tested with larger groups later.

  1. Stop the solo playtest. In Studio's testing mode dropdown select Server & Clients, choose 2 clients and press Play (or F7).
  2. In Client 1, click the game viewport and press 1 once. Watch both client windows. The slash should appear in front of Player 1 for both clients.
  3. In Client 2, click the game viewport and press 1. Again, watch both client windows. The slash should now appear in front of Player 2 for both clients.
  4. Check that Q, R, F, health/CE UI and existing combat still work. Look for new red script errors in the Output of any session.
  5. Use End Session. Save a new copy of the Roblox place with your working visual prototype intact.
Pass: Each player's keypress produces a slash seen by both clients; the original game still works and the Output is clean.
Only one player sees the effect?

Stop here. Check that the Part is created inside the existing server CombatActionHandler Script and parented to workspace. Don't move the effect into a LocalScript to make it appear. Save the Output error and check the actual script before editing.

The next separate build should move ability visuals into a modular service and implement Henry's confirmed damage, CE, cooldown, windup and hit validation rules. Those are not part of this visual prototype.

Save what actually worked.

Steps 01–05 establish the first working slash. Steps 06–07 animate and layer it; Step 08 verifies it with two players. Stop at the last passed test. Save a new Roblox place copy and record the step number you reached.

Nothing here replaces Henry's existing game or his approved Phase 2 gameplay specifications. When real damage and CE rules are added, keep Henry's chosen values and label any supplied missing rule as a WORKING DEFAULT that can be revised through playtesting.