feat(ascension): 승천 시스템 A1~A10 + UserDataStorage 개인 저장 (배포 퀄리티 P11) #46
File diff suppressed because one or more lines are too long
@@ -2110,6 +2110,48 @@ function upsertUi() {
|
|||||||
text({ value: '새 게임', fontSize: 30, bold: true, color: GOLD, alignment: 0 }),
|
text({ value: '새 게임', fontSize: 30, bold: true, color: GOLD, alignment: 0 }),
|
||||||
],
|
],
|
||||||
}));
|
}));
|
||||||
|
// 승천 선택 (P11): [-] 라벨 [+]
|
||||||
|
menu.push(entity({
|
||||||
|
id: guid('menu', 190),
|
||||||
|
path: '/ui/DefaultGroup/MainMenu/AscMinus',
|
||||||
|
modelId: 'uibutton',
|
||||||
|
entryId: 'UIButton',
|
||||||
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent',
|
||||||
|
displayOrder: 5,
|
||||||
|
components: [
|
||||||
|
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 52, y: 52 }, pos: { x: -170, y: -185 }, align: ALIGN_CENTER }),
|
||||||
|
sprite({ color: { r: 0.13, g: 0.15, b: 0.18, a: 1 }, type: 1, raycast: true }),
|
||||||
|
button(),
|
||||||
|
text({ value: '-', fontSize: 30, bold: true, color: GOLD, alignment: 4 }),
|
||||||
|
],
|
||||||
|
}));
|
||||||
|
menu.push(entity({
|
||||||
|
id: guid('menu', 191),
|
||||||
|
path: '/ui/DefaultGroup/MainMenu/AscLabel',
|
||||||
|
modelId: 'uitext',
|
||||||
|
entryId: 'UIText',
|
||||||
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent',
|
||||||
|
displayOrder: 6,
|
||||||
|
components: [
|
||||||
|
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 250, y: 40 }, pos: { x: 0, y: -185 }, align: ALIGN_CENTER }),
|
||||||
|
sprite({ color: TRANSPARENT }),
|
||||||
|
text({ value: '승천 0 / 해금 0', fontSize: 22, bold: true, color: { r: 0.85, g: 0.7, b: 0.95, a: 1 }, alignment: 4 }),
|
||||||
|
],
|
||||||
|
}));
|
||||||
|
menu.push(entity({
|
||||||
|
id: guid('menu', 192),
|
||||||
|
path: '/ui/DefaultGroup/MainMenu/AscPlus',
|
||||||
|
modelId: 'uibutton',
|
||||||
|
entryId: 'UIButton',
|
||||||
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent',
|
||||||
|
displayOrder: 7,
|
||||||
|
components: [
|
||||||
|
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 52, y: 52 }, pos: { x: 170, y: -185 }, align: ALIGN_CENTER }),
|
||||||
|
sprite({ color: { r: 0.13, g: 0.15, b: 0.18, a: 1 }, type: 1, raycast: true }),
|
||||||
|
button(),
|
||||||
|
text({ value: '+', fontSize: 30, bold: true, color: GOLD, alignment: 4 }),
|
||||||
|
],
|
||||||
|
}));
|
||||||
menu.push(entity({
|
menu.push(entity({
|
||||||
id: guid('menu', 4),
|
id: guid('menu', 4),
|
||||||
path: '/ui/DefaultGroup/MainMenu/ContinueButton',
|
path: '/ui/DefaultGroup/MainMenu/ContinueButton',
|
||||||
@@ -2360,8 +2402,12 @@ function writeCodeblocks() {
|
|||||||
prop('any', 'NewGameHandler'),
|
prop('any', 'NewGameHandler'),
|
||||||
prop('any', 'WarriorSelectHandler'),
|
prop('any', 'WarriorSelectHandler'),
|
||||||
prop('any', 'MageSelectHandler'),
|
prop('any', 'MageSelectHandler'),
|
||||||
|
prop('any', 'AscMinusHandler'),
|
||||||
|
prop('any', 'AscPlusHandler'),
|
||||||
prop('any', 'JobOpts'),
|
prop('any', 'JobOpts'),
|
||||||
prop('any', 'Jobs'),
|
prop('any', 'Jobs'),
|
||||||
|
prop('number', 'AscensionLevel', '0'),
|
||||||
|
prop('number', 'AscensionUnlocked', '0'),
|
||||||
prop('any', 'StartGameHandler'),
|
prop('any', 'StartGameHandler'),
|
||||||
prop('string', 'SelectedClass', '""'),
|
prop('string', 'SelectedClass', '""'),
|
||||||
prop('any', 'DrawPileHandler'),
|
prop('any', 'DrawPileHandler'),
|
||||||
@@ -2418,7 +2464,57 @@ function writeCodeblocks() {
|
|||||||
prop('boolean', 'ChestOpened', 'false'),
|
prop('boolean', 'ChestOpened', 'false'),
|
||||||
prop('string', 'PlayerJob', '""'),
|
prop('string', 'PlayerJob', '""'),
|
||||||
], [
|
], [
|
||||||
method('OnBeginPlay', `self:ShowMainMenu()`),
|
method('OnBeginPlay', `self:ShowMainMenu()
|
||||||
|
local lp = _UserService.LocalPlayer
|
||||||
|
if lp ~= nil then
|
||||||
|
self:ReqLoadAscension(lp.UserId)
|
||||||
|
end`),
|
||||||
|
method('ReqLoadAscension', `local ds = _DataStorageService:GetUserDataStorage(userId)
|
||||||
|
local errCode, value = ds:GetAndWait("ascensionUnlocked")
|
||||||
|
local n = 0
|
||||||
|
if errCode == 0 and value ~= nil and value ~= "" then
|
||||||
|
n = tonumber(value) or 0
|
||||||
|
end
|
||||||
|
self:RecvAscension(n, userId)`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'userId' }], 1),
|
||||||
|
method('RecvAscension', `self.AscensionUnlocked = n
|
||||||
|
if self.AscensionLevel > self.AscensionUnlocked then
|
||||||
|
self.AscensionLevel = self.AscensionUnlocked
|
||||||
|
end
|
||||||
|
self:RenderAscension()`, [
|
||||||
|
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'n' },
|
||||||
|
{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'userId' },
|
||||||
|
], 2),
|
||||||
|
method('SaveAscension', `local ds = _DataStorageService:GetUserDataStorage(userId)
|
||||||
|
ds:SetAndWait("ascensionUnlocked", tostring(n))`, [
|
||||||
|
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'n' },
|
||||||
|
{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'userId' },
|
||||||
|
], 1),
|
||||||
|
method('AdjustAscension', `local v = self.AscensionLevel + delta
|
||||||
|
if v < 0 then v = 0 end
|
||||||
|
if v > self.AscensionUnlocked then v = self.AscensionUnlocked end
|
||||||
|
self.AscensionLevel = v
|
||||||
|
self:RenderAscension()`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'delta' }]),
|
||||||
|
method('RenderAscension', `self:SetText("/ui/DefaultGroup/MainMenu/AscLabel", "승천 " .. string.format("%d", self.AscensionLevel) .. " / 해금 " .. string.format("%d", self.AscensionUnlocked))`),
|
||||||
|
method('AscHpMult', `local m = 1
|
||||||
|
if self.AscensionLevel >= 1 then m = m + 0.1 end
|
||||||
|
if self.AscensionLevel >= 6 then m = m + 0.1 end
|
||||||
|
return m`, [], 0, 'number'),
|
||||||
|
method('AscAtkMult', `local m = 1
|
||||||
|
if self.AscensionLevel >= 2 then m = m + 0.1 end
|
||||||
|
if self.AscensionLevel >= 7 then m = m + 0.1 end
|
||||||
|
return m`, [], 0, 'number'),
|
||||||
|
method('AscEliteBonus', `local b = 0
|
||||||
|
if self.AscensionLevel >= 4 then b = b + 0.2 end
|
||||||
|
if self.AscensionLevel >= 9 then b = b + 0.2 end
|
||||||
|
return b`, [], 0, 'number'),
|
||||||
|
method('AscGoldMult', `local m = 1
|
||||||
|
if self.AscensionLevel >= 5 then m = m - 0.25 end
|
||||||
|
if self.AscensionLevel >= 10 then m = m - 0.25 end
|
||||||
|
return m`, [], 0, 'number'),
|
||||||
|
method('AscStartHpPenalty', `local p = 0
|
||||||
|
if self.AscensionLevel >= 3 then p = p + 10 end
|
||||||
|
if self.AscensionLevel >= 8 then p = p + 10 end
|
||||||
|
return p`, [], 0, 'number'),
|
||||||
method('HideGameHud', `self:SetEntityEnabled("/ui/DefaultGroup/Button_Attack", false)
|
method('HideGameHud', `self:SetEntityEnabled("/ui/DefaultGroup/Button_Attack", false)
|
||||||
self:SetEntityEnabled("/ui/DefaultGroup/Button_Jump", false)
|
self:SetEntityEnabled("/ui/DefaultGroup/Button_Jump", false)
|
||||||
self:SetEntityEnabled("/ui/DefaultGroup/UIJoystick", false)
|
self:SetEntityEnabled("/ui/DefaultGroup/UIJoystick", false)
|
||||||
@@ -2451,6 +2547,7 @@ elseif state == "treasure" then
|
|||||||
self:SetEntityEnabled("/ui/DefaultGroup/TreasureHud", true)
|
self:SetEntityEnabled("/ui/DefaultGroup/TreasureHud", true)
|
||||||
end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'state' }]),
|
end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'state' }]),
|
||||||
method('ShowMainMenu', `self.SelectedClass = ""
|
method('ShowMainMenu', `self.SelectedClass = ""
|
||||||
|
self:RenderAscension()
|
||||||
self:ShowState("menu")
|
self:ShowState("menu")
|
||||||
self:SetText("/ui/DefaultGroup/MainMenu/Title", "메이플 덱 어드벤처")
|
self:SetText("/ui/DefaultGroup/MainMenu/Title", "메이플 덱 어드벤처")
|
||||||
self:SetText("/ui/DefaultGroup/MainMenu/Subtitle", "캐릭터를 고르고 덱을 만들어 모험을 시작하세요")
|
self:SetText("/ui/DefaultGroup/MainMenu/Subtitle", "캐릭터를 고르고 덱을 만들어 모험을 시작하세요")
|
||||||
@@ -2487,6 +2584,22 @@ if start ~= nil and start.ButtonComponent ~= nil then
|
|||||||
self.StartGameHandler = nil
|
self.StartGameHandler = nil
|
||||||
end
|
end
|
||||||
self.StartGameHandler = start:ConnectEvent(ButtonClickEvent, function() self:StartNewGame() end)
|
self.StartGameHandler = start:ConnectEvent(ButtonClickEvent, function() self:StartNewGame() end)
|
||||||
|
end
|
||||||
|
local ascMinus = _EntityService:GetEntityByPath("/ui/DefaultGroup/MainMenu/AscMinus")
|
||||||
|
if ascMinus ~= nil and ascMinus.ButtonComponent ~= nil then
|
||||||
|
if self.AscMinusHandler ~= nil then
|
||||||
|
ascMinus:DisconnectEvent(ButtonClickEvent, self.AscMinusHandler)
|
||||||
|
self.AscMinusHandler = nil
|
||||||
|
end
|
||||||
|
self.AscMinusHandler = ascMinus:ConnectEvent(ButtonClickEvent, function() self:AdjustAscension(-1) end)
|
||||||
|
end
|
||||||
|
local ascPlus = _EntityService:GetEntityByPath("/ui/DefaultGroup/MainMenu/AscPlus")
|
||||||
|
if ascPlus ~= nil and ascPlus.ButtonComponent ~= nil then
|
||||||
|
if self.AscPlusHandler ~= nil then
|
||||||
|
ascPlus:DisconnectEvent(ButtonClickEvent, self.AscPlusHandler)
|
||||||
|
self.AscPlusHandler = nil
|
||||||
|
end
|
||||||
|
self.AscPlusHandler = ascPlus:ConnectEvent(ButtonClickEvent, function() self:AdjustAscension(1) end)
|
||||||
end`),
|
end`),
|
||||||
method('ShowCharacterSelect', `self.SelectedClass = ""
|
method('ShowCharacterSelect', `self.SelectedClass = ""
|
||||||
self:ShowState("charselect")
|
self:ShowState("charselect")
|
||||||
@@ -2537,6 +2650,7 @@ else
|
|||||||
self.PlayerMaxHp = ${CLASSES.warrior.maxHp}
|
self.PlayerMaxHp = ${CLASSES.warrior.maxHp}
|
||||||
self.RunDeck = { ${CARDS.starterDecks.warrior.map(luaStr).join(', ')} }
|
self.RunDeck = { ${CARDS.starterDecks.warrior.map(luaStr).join(', ')} }
|
||||||
end
|
end
|
||||||
|
self.PlayerMaxHp = self.PlayerMaxHp - self:AscStartHpPenalty()
|
||||||
self.PlayerHp = self.PlayerMaxHp
|
self.PlayerHp = self.PlayerMaxHp
|
||||||
self.Gold = 0
|
self.Gold = 0
|
||||||
self.Floor = 1
|
self.Floor = 1
|
||||||
@@ -2626,6 +2740,9 @@ for i = 1, #reg do
|
|||||||
end
|
end
|
||||||
table.sort(list, function(a, b) return a.x < b.x end)
|
table.sort(list, function(a, b) return a.x < b.x end)
|
||||||
local mult = 1 + (self.Floor - 1) * 0.6
|
local mult = 1 + (self.Floor - 1) * 0.6
|
||||||
|
if g == "elite" or g == "boss" then
|
||||||
|
mult = mult + self:AscEliteBonus()
|
||||||
|
end
|
||||||
local n = #list
|
local n = #list
|
||||||
if n > ${MAX_MONSTERS} then n = ${MAX_MONSTERS} end
|
if n > ${MAX_MONSTERS} then n = ${MAX_MONSTERS} end
|
||||||
for i = 1, n do
|
for i = 1, n do
|
||||||
@@ -2635,12 +2752,14 @@ for i = 1, n do
|
|||||||
local intents = {}
|
local intents = {}
|
||||||
for k = 1, #e.intents do
|
for k = 1, #e.intents do
|
||||||
local v = e.intents[k].value
|
local v = e.intents[k].value
|
||||||
if e.intents[k].kind ~= "Debuff" then
|
if e.intents[k].kind == "Attack" then
|
||||||
|
v = math.floor(v * mult * self:AscAtkMult())
|
||||||
|
elseif e.intents[k].kind ~= "Debuff" then
|
||||||
v = math.floor(v * mult)
|
v = math.floor(v * mult)
|
||||||
end
|
end
|
||||||
intents[k] = { kind = e.intents[k].kind, value = v, effect = e.intents[k].effect }
|
intents[k] = { kind = e.intents[k].kind, value = v, effect = e.intents[k].effect }
|
||||||
end
|
end
|
||||||
local maxHp = math.floor(e.maxHp * mult)
|
local maxHp = math.floor(e.maxHp * mult * self:AscHpMult())
|
||||||
self.Monsters[i] = { entity = item.entity, enemyId = item.enemyId, name = e.name,
|
self.Monsters[i] = { entity = item.entity, enemyId = item.enemyId, name = e.name,
|
||||||
hp = maxHp, maxHp = maxHp, block = 0, str = 0, weak = 0, vuln = 0, poison = 0,
|
hp = maxHp, maxHp = maxHp, block = 0, str = 0, weak = 0, vuln = 0, poison = 0,
|
||||||
intents = intents, intentIdx = 1, alive = true, slot = i }
|
intents = intents, intentIdx = 1, alive = true, slot = i }
|
||||||
@@ -3476,7 +3595,7 @@ for i = 1, #self.Monsters do
|
|||||||
end
|
end
|
||||||
if anyAlive == false then
|
if anyAlive == false then
|
||||||
self.CombatOver = true
|
self.CombatOver = true
|
||||||
self.Gold = self.Gold + ${GOLD_PER_WIN}
|
self.Gold = self.Gold + math.floor(${GOLD_PER_WIN} * self:AscGoldMult())
|
||||||
self:ApplyRelics("combatEnd")
|
self:ApplyRelics("combatEnd")
|
||||||
self:ApplyRelics("combatReward")
|
self:ApplyRelics("combatReward")
|
||||||
self:MaybeDropPotion()
|
self:MaybeDropPotion()
|
||||||
@@ -3614,7 +3733,17 @@ local entity = _EntityService:GetEntityByPath("/ui/DefaultGroup/CombatHud/Result
|
|||||||
if entity ~= nil then
|
if entity ~= nil then
|
||||||
entity.Enable = true
|
entity.Enable = true
|
||||||
end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'text' }]),
|
end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'text' }]),
|
||||||
method('EndRun', `self:ShowResult(text)
|
method('EndRun', `local msg = text
|
||||||
|
if text == "런 클리어!" and self.AscensionLevel >= self.AscensionUnlocked and self.AscensionUnlocked < 10 then
|
||||||
|
self.AscensionUnlocked = self.AscensionUnlocked + 1
|
||||||
|
local lp = _UserService.LocalPlayer
|
||||||
|
if lp ~= nil then
|
||||||
|
self:SaveAscension(self.AscensionUnlocked, lp.UserId)
|
||||||
|
end
|
||||||
|
self:RenderAscension()
|
||||||
|
msg = "런 클리어! 승천 " .. string.format("%d", self.AscensionUnlocked) .. " 해금!"
|
||||||
|
end
|
||||||
|
self:ShowResult(msg)
|
||||||
self.RunActive = false
|
self.RunActive = false
|
||||||
_TimerService:SetTimerOnce(function() self:ShowMainMenu() end, 4)`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'text' }]),
|
_TimerService:SetTimerOnce(function() self:ShowMainMenu() end, 4)`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'text' }]),
|
||||||
method('BuffsLabel', `local parts = {}
|
method('BuffsLabel', `local parts = {}
|
||||||
@@ -3733,7 +3862,11 @@ end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], N
|
|||||||
self.TargetIndex = slot
|
self.TargetIndex = slot
|
||||||
self:RenderCombat()
|
self:RenderCombat()
|
||||||
end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }]),
|
end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }]),
|
||||||
method('RenderRun', `self:SetText("/ui/DefaultGroup/CombatHud/TopBar/Floor", "막 " .. string.format("%d", self.Floor) .. "/" .. string.format("%d", self.RunLength) .. " · " .. string.format("%d", self.Depth) .. "층")
|
method('RenderRun', `local floorText = "막 " .. string.format("%d", self.Floor) .. "/" .. string.format("%d", self.RunLength) .. " · " .. string.format("%d", self.Depth) .. "층"
|
||||||
|
if self.AscensionLevel > 0 then
|
||||||
|
floorText = floorText .. " · 승천" .. string.format("%d", self.AscensionLevel)
|
||||||
|
end
|
||||||
|
self:SetText("/ui/DefaultGroup/CombatHud/TopBar/Floor", floorText)
|
||||||
self:SetText("/ui/DefaultGroup/CombatHud/TopBar/Gold", "메소 " .. string.format("%d", self.Gold))`),
|
self:SetText("/ui/DefaultGroup/CombatHud/TopBar/Gold", "메소 " .. string.format("%d", self.Gold))`),
|
||||||
method('CardPool', `local pool = {}
|
method('CardPool', `local pool = {}
|
||||||
for id, c in pairs(self.Cards) do
|
for id, c in pairs(self.Cards) do
|
||||||
@@ -4409,7 +4542,7 @@ _TimerService:SetTimerOnce(function()
|
|||||||
end, 0.55)`),
|
end, 0.55)`),
|
||||||
]);
|
]);
|
||||||
for (const m of combat.ContentProto.Json.Methods) {
|
for (const m of combat.ContentProto.Json.Methods) {
|
||||||
m.ExecSpace = 6;
|
if (m.ExecSpace === 0) m.ExecSpace = 6; // 기본은 ClientOnly(6), 서버 RPC(Server=1·Client=2) 명시값은 보존
|
||||||
}
|
}
|
||||||
writeFileSync('RootDesk/MyDesk/SlayDeckController.codeblock', JSON.stringify(combat, null, 2), 'utf8');
|
writeFileSync('RootDesk/MyDesk/SlayDeckController.codeblock', JSON.stringify(combat, null, 2), 'utf8');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -287218,6 +287218,664 @@
|
|||||||
"@version": 1
|
"@version": 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "0e0000be-0000-4000-8000-00000e0000be",
|
||||||
|
"path": "/ui/DefaultGroup/MainMenu/AscMinus",
|
||||||
|
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent",
|
||||||
|
"jsonString": {
|
||||||
|
"name": "AscMinus",
|
||||||
|
"path": "/ui/DefaultGroup/MainMenu/AscMinus",
|
||||||
|
"nameEditable": true,
|
||||||
|
"enable": true,
|
||||||
|
"visible": true,
|
||||||
|
"localize": true,
|
||||||
|
"displayOrder": 5,
|
||||||
|
"pathConstraints": "////",
|
||||||
|
"revision": 1,
|
||||||
|
"origin": {
|
||||||
|
"type": "Model",
|
||||||
|
"entry_id": "UIButton",
|
||||||
|
"sub_entity_id": null,
|
||||||
|
"root_entity_id": null,
|
||||||
|
"replaced_model_id": null
|
||||||
|
},
|
||||||
|
"modelId": "uibutton",
|
||||||
|
"@components": [
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.UITransformComponent",
|
||||||
|
"ActivePlatform": 255,
|
||||||
|
"AlignmentOption": 0,
|
||||||
|
"AnchorsMax": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"AnchorsMin": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"MobileOnly": false,
|
||||||
|
"OffsetMax": {
|
||||||
|
"x": -144,
|
||||||
|
"y": -159
|
||||||
|
},
|
||||||
|
"OffsetMin": {
|
||||||
|
"x": -196,
|
||||||
|
"y": -211
|
||||||
|
},
|
||||||
|
"Pivot": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"RectSize": {
|
||||||
|
"x": 52,
|
||||||
|
"y": 52
|
||||||
|
},
|
||||||
|
"UIMode": 1,
|
||||||
|
"UIScale": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1,
|
||||||
|
"z": 1
|
||||||
|
},
|
||||||
|
"UIVersion": 2,
|
||||||
|
"anchoredPosition": {
|
||||||
|
"x": -170,
|
||||||
|
"y": -185
|
||||||
|
},
|
||||||
|
"Position": {
|
||||||
|
"x": -170,
|
||||||
|
"y": -185,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"QuaternionRotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0,
|
||||||
|
"w": 1
|
||||||
|
},
|
||||||
|
"Scale": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1,
|
||||||
|
"z": 1
|
||||||
|
},
|
||||||
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.SpriteGUIRendererComponent",
|
||||||
|
"AnimClipPlayType": 0,
|
||||||
|
"EndFrameIndex": 2147483647,
|
||||||
|
"ImageRUID": {
|
||||||
|
"DataId": ""
|
||||||
|
},
|
||||||
|
"LocalPosition": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"LocalScale": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"OverrideSorting": false,
|
||||||
|
"PlayRate": 1,
|
||||||
|
"PreserveSprite": 0,
|
||||||
|
"StartFrameIndex": 0,
|
||||||
|
"Color": {
|
||||||
|
"r": 0.13,
|
||||||
|
"g": 0.15,
|
||||||
|
"b": 0.18,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"DropShadow": false,
|
||||||
|
"DropShadowAngle": 30,
|
||||||
|
"DropShadowColor": {
|
||||||
|
"r": 0,
|
||||||
|
"g": 0,
|
||||||
|
"b": 0,
|
||||||
|
"a": 0.72
|
||||||
|
},
|
||||||
|
"DropShadowDistance": 32,
|
||||||
|
"FillAmount": 1,
|
||||||
|
"FillCenter": true,
|
||||||
|
"FillClockWise": true,
|
||||||
|
"FillMethod": 0,
|
||||||
|
"FillOrigin": 0,
|
||||||
|
"FlipX": false,
|
||||||
|
"FlipY": false,
|
||||||
|
"FrameColumn": 1,
|
||||||
|
"FrameRate": 0,
|
||||||
|
"FrameRow": 1,
|
||||||
|
"Outline": false,
|
||||||
|
"OutlineColor": {
|
||||||
|
"r": 0,
|
||||||
|
"g": 0,
|
||||||
|
"b": 0,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"OutlineWidth": 3,
|
||||||
|
"RaycastTarget": true,
|
||||||
|
"Type": 1,
|
||||||
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.ButtonComponent",
|
||||||
|
"Colors": {
|
||||||
|
"NormalColor": {
|
||||||
|
"r": 1,
|
||||||
|
"g": 1,
|
||||||
|
"b": 1,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"HighlightedColor": {
|
||||||
|
"r": 0.9607843,
|
||||||
|
"g": 0.9607843,
|
||||||
|
"b": 0.9607843,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"PressedColor": {
|
||||||
|
"r": 0.784313738,
|
||||||
|
"g": 0.784313738,
|
||||||
|
"b": 0.784313738,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"SelectedColor": {
|
||||||
|
"r": 0.9607843,
|
||||||
|
"g": 0.9607843,
|
||||||
|
"b": 0.9607843,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"DisabledColor": {
|
||||||
|
"r": 0.784313738,
|
||||||
|
"g": 0.784313738,
|
||||||
|
"b": 0.784313738,
|
||||||
|
"a": 0.5019608
|
||||||
|
},
|
||||||
|
"ColorMultiplier": 1,
|
||||||
|
"FadeDuration": 0.1
|
||||||
|
},
|
||||||
|
"ImageRUIDs": {
|
||||||
|
"HighlightedSprite": null,
|
||||||
|
"PressedSprite": null,
|
||||||
|
"SelectedSprite": null,
|
||||||
|
"DisabledSprite": null
|
||||||
|
},
|
||||||
|
"KeyCode": 0,
|
||||||
|
"OverrideSorting": false,
|
||||||
|
"Transition": 1,
|
||||||
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.TextComponent",
|
||||||
|
"Alignment": 4,
|
||||||
|
"Bold": true,
|
||||||
|
"DropShadow": false,
|
||||||
|
"DropShadowAngle": 30,
|
||||||
|
"DropShadowColor": {
|
||||||
|
"r": 0,
|
||||||
|
"g": 0,
|
||||||
|
"b": 0,
|
||||||
|
"a": 0.72
|
||||||
|
},
|
||||||
|
"DropShadowDistance": 32,
|
||||||
|
"Font": 0,
|
||||||
|
"FontColor": {
|
||||||
|
"r": 0.94,
|
||||||
|
"g": 0.74,
|
||||||
|
"b": 0.26,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"FontSize": 30,
|
||||||
|
"MaxSize": 30,
|
||||||
|
"MinSize": 8,
|
||||||
|
"OutlineColor": {
|
||||||
|
"r": 0.08,
|
||||||
|
"g": 0.08,
|
||||||
|
"b": 0.08,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"OutlineDistance": {
|
||||||
|
"x": 1,
|
||||||
|
"y": -1
|
||||||
|
},
|
||||||
|
"OutlineWidth": 1,
|
||||||
|
"Overflow": 0,
|
||||||
|
"OverrideSorting": false,
|
||||||
|
"Padding": {
|
||||||
|
"left": 0,
|
||||||
|
"right": 0,
|
||||||
|
"top": 0,
|
||||||
|
"bottom": 0
|
||||||
|
},
|
||||||
|
"SizeFit": false,
|
||||||
|
"Text": "-",
|
||||||
|
"UseOutLine": true,
|
||||||
|
"Enable": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"@version": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "0e0000bf-0000-4000-8000-00000e0000bf",
|
||||||
|
"path": "/ui/DefaultGroup/MainMenu/AscLabel",
|
||||||
|
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent",
|
||||||
|
"jsonString": {
|
||||||
|
"name": "AscLabel",
|
||||||
|
"path": "/ui/DefaultGroup/MainMenu/AscLabel",
|
||||||
|
"nameEditable": true,
|
||||||
|
"enable": true,
|
||||||
|
"visible": true,
|
||||||
|
"localize": true,
|
||||||
|
"displayOrder": 6,
|
||||||
|
"pathConstraints": "////",
|
||||||
|
"revision": 1,
|
||||||
|
"origin": {
|
||||||
|
"type": "Model",
|
||||||
|
"entry_id": "UIText",
|
||||||
|
"sub_entity_id": null,
|
||||||
|
"root_entity_id": null,
|
||||||
|
"replaced_model_id": null
|
||||||
|
},
|
||||||
|
"modelId": "uitext",
|
||||||
|
"@components": [
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.UITransformComponent",
|
||||||
|
"ActivePlatform": 255,
|
||||||
|
"AlignmentOption": 0,
|
||||||
|
"AnchorsMax": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"AnchorsMin": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"MobileOnly": false,
|
||||||
|
"OffsetMax": {
|
||||||
|
"x": 125,
|
||||||
|
"y": -165
|
||||||
|
},
|
||||||
|
"OffsetMin": {
|
||||||
|
"x": -125,
|
||||||
|
"y": -205
|
||||||
|
},
|
||||||
|
"Pivot": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"RectSize": {
|
||||||
|
"x": 250,
|
||||||
|
"y": 40
|
||||||
|
},
|
||||||
|
"UIMode": 1,
|
||||||
|
"UIScale": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1,
|
||||||
|
"z": 1
|
||||||
|
},
|
||||||
|
"UIVersion": 2,
|
||||||
|
"anchoredPosition": {
|
||||||
|
"x": 0,
|
||||||
|
"y": -185
|
||||||
|
},
|
||||||
|
"Position": {
|
||||||
|
"x": 0,
|
||||||
|
"y": -185,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"QuaternionRotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0,
|
||||||
|
"w": 1
|
||||||
|
},
|
||||||
|
"Scale": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1,
|
||||||
|
"z": 1
|
||||||
|
},
|
||||||
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.SpriteGUIRendererComponent",
|
||||||
|
"AnimClipPlayType": 0,
|
||||||
|
"EndFrameIndex": 2147483647,
|
||||||
|
"ImageRUID": {
|
||||||
|
"DataId": ""
|
||||||
|
},
|
||||||
|
"LocalPosition": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"LocalScale": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"OverrideSorting": false,
|
||||||
|
"PlayRate": 1,
|
||||||
|
"PreserveSprite": 0,
|
||||||
|
"StartFrameIndex": 0,
|
||||||
|
"Color": {
|
||||||
|
"r": 0,
|
||||||
|
"g": 0,
|
||||||
|
"b": 0,
|
||||||
|
"a": 0
|
||||||
|
},
|
||||||
|
"DropShadow": false,
|
||||||
|
"DropShadowAngle": 30,
|
||||||
|
"DropShadowColor": {
|
||||||
|
"r": 0,
|
||||||
|
"g": 0,
|
||||||
|
"b": 0,
|
||||||
|
"a": 0.72
|
||||||
|
},
|
||||||
|
"DropShadowDistance": 32,
|
||||||
|
"FillAmount": 1,
|
||||||
|
"FillCenter": true,
|
||||||
|
"FillClockWise": true,
|
||||||
|
"FillMethod": 0,
|
||||||
|
"FillOrigin": 0,
|
||||||
|
"FlipX": false,
|
||||||
|
"FlipY": false,
|
||||||
|
"FrameColumn": 1,
|
||||||
|
"FrameRate": 0,
|
||||||
|
"FrameRow": 1,
|
||||||
|
"Outline": false,
|
||||||
|
"OutlineColor": {
|
||||||
|
"r": 0,
|
||||||
|
"g": 0,
|
||||||
|
"b": 0,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"OutlineWidth": 3,
|
||||||
|
"RaycastTarget": false,
|
||||||
|
"Type": 1,
|
||||||
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.TextComponent",
|
||||||
|
"Alignment": 4,
|
||||||
|
"Bold": true,
|
||||||
|
"DropShadow": false,
|
||||||
|
"DropShadowAngle": 30,
|
||||||
|
"DropShadowColor": {
|
||||||
|
"r": 0,
|
||||||
|
"g": 0,
|
||||||
|
"b": 0,
|
||||||
|
"a": 0.72
|
||||||
|
},
|
||||||
|
"DropShadowDistance": 32,
|
||||||
|
"Font": 0,
|
||||||
|
"FontColor": {
|
||||||
|
"r": 0.85,
|
||||||
|
"g": 0.7,
|
||||||
|
"b": 0.95,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"FontSize": 22,
|
||||||
|
"MaxSize": 22,
|
||||||
|
"MinSize": 8,
|
||||||
|
"OutlineColor": {
|
||||||
|
"r": 0.08,
|
||||||
|
"g": 0.08,
|
||||||
|
"b": 0.08,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"OutlineDistance": {
|
||||||
|
"x": 1,
|
||||||
|
"y": -1
|
||||||
|
},
|
||||||
|
"OutlineWidth": 1,
|
||||||
|
"Overflow": 0,
|
||||||
|
"OverrideSorting": false,
|
||||||
|
"Padding": {
|
||||||
|
"left": 0,
|
||||||
|
"right": 0,
|
||||||
|
"top": 0,
|
||||||
|
"bottom": 0
|
||||||
|
},
|
||||||
|
"SizeFit": false,
|
||||||
|
"Text": "승천 0 / 해금 0",
|
||||||
|
"UseOutLine": true,
|
||||||
|
"Enable": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"@version": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "0e0000c0-0000-4000-8000-00000e0000c0",
|
||||||
|
"path": "/ui/DefaultGroup/MainMenu/AscPlus",
|
||||||
|
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent",
|
||||||
|
"jsonString": {
|
||||||
|
"name": "AscPlus",
|
||||||
|
"path": "/ui/DefaultGroup/MainMenu/AscPlus",
|
||||||
|
"nameEditable": true,
|
||||||
|
"enable": true,
|
||||||
|
"visible": true,
|
||||||
|
"localize": true,
|
||||||
|
"displayOrder": 7,
|
||||||
|
"pathConstraints": "////",
|
||||||
|
"revision": 1,
|
||||||
|
"origin": {
|
||||||
|
"type": "Model",
|
||||||
|
"entry_id": "UIButton",
|
||||||
|
"sub_entity_id": null,
|
||||||
|
"root_entity_id": null,
|
||||||
|
"replaced_model_id": null
|
||||||
|
},
|
||||||
|
"modelId": "uibutton",
|
||||||
|
"@components": [
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.UITransformComponent",
|
||||||
|
"ActivePlatform": 255,
|
||||||
|
"AlignmentOption": 0,
|
||||||
|
"AnchorsMax": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"AnchorsMin": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"MobileOnly": false,
|
||||||
|
"OffsetMax": {
|
||||||
|
"x": 196,
|
||||||
|
"y": -159
|
||||||
|
},
|
||||||
|
"OffsetMin": {
|
||||||
|
"x": 144,
|
||||||
|
"y": -211
|
||||||
|
},
|
||||||
|
"Pivot": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"RectSize": {
|
||||||
|
"x": 52,
|
||||||
|
"y": 52
|
||||||
|
},
|
||||||
|
"UIMode": 1,
|
||||||
|
"UIScale": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1,
|
||||||
|
"z": 1
|
||||||
|
},
|
||||||
|
"UIVersion": 2,
|
||||||
|
"anchoredPosition": {
|
||||||
|
"x": 170,
|
||||||
|
"y": -185
|
||||||
|
},
|
||||||
|
"Position": {
|
||||||
|
"x": 170,
|
||||||
|
"y": -185,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"QuaternionRotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0,
|
||||||
|
"w": 1
|
||||||
|
},
|
||||||
|
"Scale": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1,
|
||||||
|
"z": 1
|
||||||
|
},
|
||||||
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.SpriteGUIRendererComponent",
|
||||||
|
"AnimClipPlayType": 0,
|
||||||
|
"EndFrameIndex": 2147483647,
|
||||||
|
"ImageRUID": {
|
||||||
|
"DataId": ""
|
||||||
|
},
|
||||||
|
"LocalPosition": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"LocalScale": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"OverrideSorting": false,
|
||||||
|
"PlayRate": 1,
|
||||||
|
"PreserveSprite": 0,
|
||||||
|
"StartFrameIndex": 0,
|
||||||
|
"Color": {
|
||||||
|
"r": 0.13,
|
||||||
|
"g": 0.15,
|
||||||
|
"b": 0.18,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"DropShadow": false,
|
||||||
|
"DropShadowAngle": 30,
|
||||||
|
"DropShadowColor": {
|
||||||
|
"r": 0,
|
||||||
|
"g": 0,
|
||||||
|
"b": 0,
|
||||||
|
"a": 0.72
|
||||||
|
},
|
||||||
|
"DropShadowDistance": 32,
|
||||||
|
"FillAmount": 1,
|
||||||
|
"FillCenter": true,
|
||||||
|
"FillClockWise": true,
|
||||||
|
"FillMethod": 0,
|
||||||
|
"FillOrigin": 0,
|
||||||
|
"FlipX": false,
|
||||||
|
"FlipY": false,
|
||||||
|
"FrameColumn": 1,
|
||||||
|
"FrameRate": 0,
|
||||||
|
"FrameRow": 1,
|
||||||
|
"Outline": false,
|
||||||
|
"OutlineColor": {
|
||||||
|
"r": 0,
|
||||||
|
"g": 0,
|
||||||
|
"b": 0,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"OutlineWidth": 3,
|
||||||
|
"RaycastTarget": true,
|
||||||
|
"Type": 1,
|
||||||
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.ButtonComponent",
|
||||||
|
"Colors": {
|
||||||
|
"NormalColor": {
|
||||||
|
"r": 1,
|
||||||
|
"g": 1,
|
||||||
|
"b": 1,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"HighlightedColor": {
|
||||||
|
"r": 0.9607843,
|
||||||
|
"g": 0.9607843,
|
||||||
|
"b": 0.9607843,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"PressedColor": {
|
||||||
|
"r": 0.784313738,
|
||||||
|
"g": 0.784313738,
|
||||||
|
"b": 0.784313738,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"SelectedColor": {
|
||||||
|
"r": 0.9607843,
|
||||||
|
"g": 0.9607843,
|
||||||
|
"b": 0.9607843,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"DisabledColor": {
|
||||||
|
"r": 0.784313738,
|
||||||
|
"g": 0.784313738,
|
||||||
|
"b": 0.784313738,
|
||||||
|
"a": 0.5019608
|
||||||
|
},
|
||||||
|
"ColorMultiplier": 1,
|
||||||
|
"FadeDuration": 0.1
|
||||||
|
},
|
||||||
|
"ImageRUIDs": {
|
||||||
|
"HighlightedSprite": null,
|
||||||
|
"PressedSprite": null,
|
||||||
|
"SelectedSprite": null,
|
||||||
|
"DisabledSprite": null
|
||||||
|
},
|
||||||
|
"KeyCode": 0,
|
||||||
|
"OverrideSorting": false,
|
||||||
|
"Transition": 1,
|
||||||
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "MOD.Core.TextComponent",
|
||||||
|
"Alignment": 4,
|
||||||
|
"Bold": true,
|
||||||
|
"DropShadow": false,
|
||||||
|
"DropShadowAngle": 30,
|
||||||
|
"DropShadowColor": {
|
||||||
|
"r": 0,
|
||||||
|
"g": 0,
|
||||||
|
"b": 0,
|
||||||
|
"a": 0.72
|
||||||
|
},
|
||||||
|
"DropShadowDistance": 32,
|
||||||
|
"Font": 0,
|
||||||
|
"FontColor": {
|
||||||
|
"r": 0.94,
|
||||||
|
"g": 0.74,
|
||||||
|
"b": 0.26,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"FontSize": 30,
|
||||||
|
"MaxSize": 30,
|
||||||
|
"MinSize": 8,
|
||||||
|
"OutlineColor": {
|
||||||
|
"r": 0.08,
|
||||||
|
"g": 0.08,
|
||||||
|
"b": 0.08,
|
||||||
|
"a": 1
|
||||||
|
},
|
||||||
|
"OutlineDistance": {
|
||||||
|
"x": 1,
|
||||||
|
"y": -1
|
||||||
|
},
|
||||||
|
"OutlineWidth": 1,
|
||||||
|
"Overflow": 0,
|
||||||
|
"OverrideSorting": false,
|
||||||
|
"Padding": {
|
||||||
|
"left": 0,
|
||||||
|
"right": 0,
|
||||||
|
"top": 0,
|
||||||
|
"bottom": 0
|
||||||
|
},
|
||||||
|
"SizeFit": false,
|
||||||
|
"Text": "+",
|
||||||
|
"UseOutLine": true,
|
||||||
|
"Enable": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"@version": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "0e000004-0000-4000-8000-00000e000004",
|
"id": "0e000004-0000-4000-8000-00000e000004",
|
||||||
"path": "/ui/DefaultGroup/MainMenu/ContinueButton",
|
"path": "/ui/DefaultGroup/MainMenu/ContinueButton",
|
||||||
|
|||||||
Reference in New Issue
Block a user