diff --git a/mercyv-bike/nui/script.js b/mercyv-bike/nui/script.js
index f31be93..9dccc5d 100644
--- a/mercyv-bike/nui/script.js
+++ b/mercyv-bike/nui/script.js
@@ -11,7 +11,7 @@ function postNUI(event, data) {
const app = createApp({
data() {
return {
- show: false,
+ show: false, // WICHTIG: immer false beim Start
showAdmin: false,
isAdmin: false,
bikes: [],
@@ -28,6 +28,11 @@ const app = createApp({
};
},
+ mounted() {
+ // Vue ist gemountet - div kann jetzt gesteuert werden
+ document.getElementById('app').style.display = '';
+ },
+
methods: {
close() {
this.show = false;
diff --git a/mercyv-bike/nui/style.css b/mercyv-bike/nui/style.css
index bca77fd..1676d3e 100644
--- a/mercyv-bike/nui/style.css
+++ b/mercyv-bike/nui/style.css
@@ -2,11 +2,6 @@
MercyV Bike – NUI Style (gleiche Sprache wie mercyv-garage)
═══════════════════════════════════════════════════ */
-@font-face {
- font-family: "GilroyBold";
- src: url("../mercyv-garage/nui/fonts/Gilroy-Bold.ttf") format("truetype");
-}
-
:root {
--accent: #E8830A;
--accent-hover: #F59D2A;
@@ -22,7 +17,7 @@
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
- font-family: "GilroyBold", -apple-system, sans-serif;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; font-weight: 700;
background: transparent;
color: var(--text-primary);
user-select: none;
@@ -71,7 +66,7 @@ body {
background: rgba(232,131,10,0.15);
display: flex; align-items: center; justify-content: center;
}
-.mb-title-main { font-size: 16px; font-family: "GilroyBold", sans-serif; display: block; }
+.mb-title-main { font-size: 16px; font-family: inherit; font-weight: 700; display: block; }
.mb-title-sub { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.4px; display: block; }
.mb-close-btn {
@@ -115,7 +110,7 @@ body {
.mb-bike-card:hover { border-color: rgba(232,131,10,0.4); transform: translateY(-2px); }
.mb-bike-active { border-color: var(--accent) !important; background: rgba(232,131,10,0.08) !important; }
.mb-bike-img { width: 120px; height: 75px; object-fit: contain; }
-.mb-bike-name { font-size: 13px; font-family: "GilroyBold", sans-serif; text-align: center; }
+.mb-bike-name { font-size: 13px; font-family: inherit; font-weight: 700; text-align: center; }
.mb-bike-free { font-size: 11px; color: var(--accent); }
.mb-bike-free i { margin-right: 4px; }
@@ -123,7 +118,7 @@ body {
.mb-claim-btn {
padding: 13px 32px;
background: var(--accent); border: none; border-radius: 8px;
- color: #fff; font-size: 15px; font-family: "GilroyBold", sans-serif;
+ color: #fff; font-size: 15px; font-family: inherit; font-weight: 700;
cursor: pointer; letter-spacing: 0.04em;
transition: background 0.15s, transform 0.1s;
}
@@ -172,7 +167,7 @@ body {
.mb-save-btn {
padding: 12px; border-radius: 8px;
background: var(--accent); border: none;
- color: #fff; font-size: 14px; font-family: "GilroyBold", sans-serif;
+ color: #fff; font-size: 14px; font-family: inherit; font-weight: 700;
cursor: pointer; letter-spacing: 0.04em;
transition: background 0.15s, transform 0.1s;
}
diff --git a/mercyv-bike/server/main.lua b/mercyv-bike/server/main.lua
index d810d62..575f903 100644
--- a/mercyv-bike/server/main.lua
+++ b/mercyv-bike/server/main.lua
@@ -74,8 +74,8 @@ AddEventHandler('onResourceStart', function(res)
`heading` FLOAT DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
]])
- TriggerClientEvent('mercyv-bike:syncNPC', -1, NPCData)
print('^2[mercyv-bike]^0 NPC-Daten geladen.')
+ -- Kein Broadcast hier - jeder Client bekommt die Daten beim clientReady
end)
-- ── Client ready ───────────────────────────────────────────────
diff --git a/mercyv-deathscreen/client/main.lua b/mercyv-deathscreen/client/main.lua
index 673ddef..6ce3d99 100644
--- a/mercyv-deathscreen/client/main.lua
+++ b/mercyv-deathscreen/client/main.lua
@@ -642,13 +642,13 @@ CreateThread(function()
SetBlockingOfNonTemporaryEvents(npcEntity, true)
-- ox_target Optionen für den NPC
+ -- ox_target Optionen für den NPC
exports.ox_target:addLocalEntity(npcEntity, {
{
name = 'medic_npc_heal',
icon = 'fas fa-kit-medical',
- label = 'Sich selbst heilen (Kostenlos)',
+ label = 'Sich selbst heilen ($1000)', -- Text angepasst
canInteract = function()
- -- Wird nur angezeigt, wenn man lebt und nicht volle HP (200) hat
return deathState == 'ALIVE' and GetEntityHealth(PlayerPedId()) < 200
end,
onSelect = function()
@@ -658,9 +658,8 @@ CreateThread(function()
{
name = 'medic_npc_revive',
icon = 'fas fa-heart-pulse',
- label = 'Person in der Nähe wiederbeleben',
+ label = 'Person in der Nähe wiederbeleben ($1500)', -- Text angepasst
canInteract = function()
- -- Prüfen ob jemand am Boden liegt in der Nähe des Spielers
local coords = GetEntityCoords(PlayerPedId())
local players = ESX.Game.GetPlayersInArea(coords, 5.0)
@@ -692,5 +691,4 @@ CreateThread(function()
end
end
}
- })
-end)
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/mercyv-deathscreen/server/main.lua b/mercyv-deathscreen/server/main.lua
index 5277440..844377f 100644
--- a/mercyv-deathscreen/server/main.lua
+++ b/mercyv-deathscreen/server/main.lua
@@ -333,6 +333,12 @@ end)
-- NPC MEDICAL SERVER LOGIC
-- ============================================================
+-- Preise für den NPC-Arzt einstellen
+local NPCCosts = {
+ Heal = 1000, -- Kosten für "Sich selbst heilen"
+ Revive = 1500 -- Kosten für "Andere Person wiederbeleben"
+}
+
-- Hilfsfunktion: Prüft ob EMS im Dienst ist
local function IsEMSOnDuty()
local xPlayers = ESX.GetExtendedPlayers('job', 'ambulance') -- Ersetze 'ambulance' falls dein Job anders heißt
@@ -343,6 +349,7 @@ end
RegisterNetEvent('mercyv-deathscreen:server:npcHealSelf')
AddEventHandler('mercyv-deathscreen:server:npcHealSelf', function()
local src = source
+
if IsEMSOnDuty() then
TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst! Bitte rufe den Notruf.')
return
@@ -350,8 +357,20 @@ AddEventHandler('mercyv-deathscreen:server:npcHealSelf', function()
local xPlayer = ESX.GetPlayerFromId(src)
if xPlayer then
+ local cost = NPCCosts.Heal
+
+ -- Bezahl-Logik (zuerst Bargeld, dann Bank)
+ if xPlayer.getMoney() >= cost then
+ xPlayer.removeMoney(cost)
+ elseif xPlayer.getAccount('bank').money >= cost then
+ xPlayer.removeAccountMoney('bank', cost)
+ else
+ TriggerClientEvent('esx:showNotification', src, 'Du hast nicht genug Geld! (Kosten: $' .. cost .. ')')
+ return -- Bricht hier ab, wenn kein Geld da ist
+ end
+
TriggerClientEvent('mercyv-deathscreen:client:healed', src, 200, 'big')
- TriggerClientEvent('esx:showNotification', src, 'Der Arzt hat deine Wunden versorgt.')
+ TriggerClientEvent('esx:showNotification', src, 'Der Arzt hat deine Wunden für $' .. cost .. ' versorgt.')
end
end)
@@ -359,13 +378,33 @@ end)
RegisterNetEvent('mercyv-deathscreen:server:npcReviveOther')
AddEventHandler('mercyv-deathscreen:server:npcReviveOther', function(targetId)
local src = source
+
if IsEMSOnDuty() then
TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst! Bitte rufe den Notruf.')
return
end
- if RevivePlayer(targetId) then
- TriggerClientEvent('esx:showNotification', src, 'Du hast die Person mit Hilfe des Arztes wiederbelebt.')
- TriggerClientEvent('esx:showNotification', targetId, 'Du wurdest von jemandem beim NPC-Arzt gerettet.')
+ local xPlayer = ESX.GetPlayerFromId(src)
+ if xPlayer then
+ local cost = NPCCosts.Revive
+
+ -- Bezahl-Logik (zuerst Bargeld, dann Bank)
+ if xPlayer.getMoney() >= cost then
+ xPlayer.removeMoney(cost)
+ elseif xPlayer.getAccount('bank').money >= cost then
+ xPlayer.removeAccountMoney('bank', cost)
+ else
+ TriggerClientEvent('esx:showNotification', src, 'Du hast nicht genug Geld! (Kosten: $' .. cost .. ')')
+ return -- Bricht hier ab, wenn kein Geld da ist
+ end
+
+ if RevivePlayer(targetId) then
+ TriggerClientEvent('esx:showNotification', src, 'Du hast die Person für $' .. cost .. ' wiederbelebt.')
+ TriggerClientEvent('esx:showNotification', targetId, 'Du wurdest von jemandem beim NPC-Arzt gerettet.')
+ else
+ -- Falls die Wiederbelebung fehlschlägt, geben wir das Geld zurück
+ xPlayer.addMoney(cost)
+ TriggerClientEvent('esx:showNotification', src, 'Fehler bei der Wiederbelebung. Geld wurde erstattet.')
+ end
end
end)
\ No newline at end of file