Hallo,
ich werde diesen Beitrag nutzen um die Ultimate Updates zu posten! der Beitrag kann auch gern dazu genutzt werden seine Meinung, Ideen und anregungen zu posten!
Update: Garagesystem
Disclaimer: Ihr habt es satt das eure fahrzeuge beschädigt werden? Ihr wollt keine teuren Monatliche Preise für Parkplätze bezahlen??
Hier die Lösung:
Was genau kann das System:
- Spieler sind in der Lage Garagen zu kaufen die Serverowner auf der Map verteilen.
- Jede garage ist nur einmalig kaufbar!
- Spieler können ihre Garagen wieder Verkaufen
- Sobald der Spieler die garage besitzt kann nur er sie Öffnen.
- Garagen Interaktion agiert über das Clicksystem.
- Blips werden Global gespawnt für garagen die keinen Owner haben.
- Garagen mit einem owner werden Global nicht mehr angezeigt nur der Spieler selbst sieht diese dann auf der Map.
- Speicherung per Mysql.
Wo finde ich das?
Ihr habt 2 Möglichkeiten, für die die meine Ultimate version nutzen gibt es ein normales repository update auf Github.
für alle die nur das System wollen hier ein Tutorial:
ACHTUNG: Das garagen System ist auch EInzeln auf Ultimate angepasst!!!
Spoiler anzeigen
Ich erkläre hier schritt für schritt wie ihr das System in euer Ultimate einfügt!
1. erstellt einen ordner namens "garage_system" in eurem ultimate ordner.
2. in diesem Ordner erstellt ihr nun die folgenden 2 Dateien:
- garage_client.lua
- garage_server.lua
3. in die garage_client.lua kommt folgender Code:
Spoiler anzeigen
addEvent("garagesystem:interact_owned", true)
addEventHandler("garagesystem:interact_owned", localPlayer, function(garage)
if getElementData(localPlayer, "interacting") ~= 1 then
local sx, sy = guiGetScreenSize()
local int_width, int_height = 300, 200
local x = (sx/2) - (int_width/2)
local y = (sy/2) - (int_height/2)
guielem_garagemanageframe = guiCreateWindow(x, y, int_width, int_height, "Deine garage", false)
guiCreateLabel(0.05, 0.12, 0.90, 0.10, "Verkaufswert: "..getElementData(garage, "price").." $", true, guielem_garagemanageframe)
if getElementData(garage, "doorstate") == 0 then
btnTextdoor = "Öffnen"
else
btnTextdoor = "Schließen"
end
local btnopen = guiCreateButton(0.05, 0.25, 0.90, 0.20, btnTextdoor, true, guielem_garagemanageframe)
local btnsell = guiCreateButton(0.05, 0.50, 0.90, 0.20, "Verkaufen", true, guielem_garagemanageframe)
local btncanel = guiCreateButton(0.05, 0.75, 0.90, 0.20, "Abbrechen", true, guielem_garagemanageframe)
addEventHandler("onClientGUIClick", btncanel, function()
destroyElement(guielem_garagemanageframe)
showCursor(false)
setElementData(localPlayer, "interacting", 0)
end, false)
addEventHandler("onClientGUIClick", btnopen, function()
triggerServerEvent("garagesystem:managedoor", localPlayer, garage)
destroyElement(guielem_garagemanageframe)
showCursor(false)
setElementData(localPlayer, "interacting", 0)
end, false)
addEventHandler("onClientGUIClick", btnsell, function()
destroyElement(guielem_garagemanageframe)
guielem_garagemanageframecheck = guiCreateWindow(x, y, int_width, int_height, "Deine garage Verkaufen", false)
guiCreateLabel(0.05, 0.12, 0.90, 0.10, "Willst du deine garage Wirklich verkaufen?", true, guielem_garagemanageframecheck)
local btnsell = guiCreateButton(0.05, 0.50, 0.90, 0.20, "Ja", true, guielem_garagemanageframecheck)
local btncanel = guiCreateButton(0.05, 0.75, 0.90, 0.20, "Nein!", true, guielem_garagemanageframecheck)
addEventHandler("onClientGUIClick", btnsell, function()
if getElementData(garage, "doorstate") == 0 then
triggerServerEvent("garagesystem:sellgarage", localPlayer, garage)
destroyElement(guielem_garagemanageframecheck)
showCursor(false)
setElementData(localPlayer, "interacting", 0)
else
destroyElement(guielem_garagemanageframecheck)
showCursor(false)
setElementData(localPlayer, "interacting", 0)
outputChatBox("Bitte schließe die Garag erst! Manieren müssen sein!", 255, 0, 0)
end
end, false)
addEventHandler("onClientGUIClick", btncanel, function()
destroyElement(guielem_garagemanageframecheck)
showCursor(false)
setElementData(localPlayer, "interacting", 0)
end, false)
end)
end
end)
addEvent("garagesystem:interact_notowned", true)
addEventHandler("garagesystem:interact_notowned", localPlayer, function(garage)
if getElementData(localPlayer, "interacting") ~= 1 then
local sx, sy = guiGetScreenSize()
local int_width, int_height = 300, 200
local x = (sx/2) - (int_width/2)
local y = (sy/2) - (int_height/2)
guielem_garagemanageframe = guiCreateWindow(x, y, int_width, int_height, "Garage Kaufen", false)
local l1 = guiCreateLabel(0.05, 0.10, 0.90, 0.30, "Diese garage wird dich: "..getElementData(garage, "price").." $ Kosten \n sobald du diese gekauft hast ist sie für immer\n dein Eigentum! Du kannst sie später natürlich\n wieder Verkaufen!", true, guielem_garagemanageframe)
guiLabelSetVerticalAlign(l1, "center")
local btn_kaufen = guiCreateButton(0.05, 0.45, 0.90, 0.25, "Kaufen", true, guielem_garagemanageframe)
local btn_cancel = guiCreateButton(0.05, 0.75, 0.90, 0.25, "Abbrechen", true, guielem_garagemanageframe)
addEventHandler("onClientGUIClick", btn_kaufen, function()
local price = getElementData(garage, "price")
local id = getElementData(garage, "id")
if price then
local garage = garage
triggerServerEvent("garagesystem:buyGarage", localPlayer, price, id, garage)
end
end, false)
addEventHandler("onClientGUIClick", btn_cancel, function()
destroyElement(guielem_garagemanageframe)
showCursor(false)
setElementData(localPlayer, "interacting", 0)
end, false)
end
end)
addEvent("garagesystem:closebuygui", true)
addEventHandler("garagesystem:closebuygui", localPlayer, function()
destroyElement(guielem_garagemanageframe)
setElementData(localPlayer, "interacting", 0)
showCursor(false)
end)
Alles anzeigen
4. in die garage_server.lua kommt folgender code:
Spoiler anzeigen
local function msql_gettbl(query, ...)
local GetDataset = dbQuery(handler, query, ...)
if GetDataset then
local result, rows = dbPoll(GetDataset, -1)
if result then
return result, rows
else
return false
end
else
return false
end
end
local function msql_settbl(query, ...)
local WriteDat = dbExec(handler, query, ...)
if WriteDat then
return true
else
return false
end
end
local moving = 0
if handler then
local garage_data, rows = msql_gettbl("SELECT * FROM garage_system")
if garage_data and rows >= 1 then
for i, v in pairs(garage_data) do --math.floor ( xo * 100 ) / 100
local x_garage, y_garage, z_garage, rot_garage = tonumber(gettok(v.garagepos, 1, "|")), tonumber(gettok(v.garagepos, 2, "|")), tonumber(gettok(v.garagepos, 3, "|")), tonumber(gettok(v.garagepos, 4, "|"))
local xclose_gate, yclose_gate, zclose_gate, zrot_gate = tonumber(gettok(v.doorpos, 1, "|")), tonumber(gettok(v.doorpos, 2, "|")), tonumber(gettok(v.doorpos, 3, "|")), tonumber(gettok(v.doorpos, 4, "|"))
local owner = v.ownedby
local buyprice = v.buyprice
local sellprice = v.sellprice
local id = v.id
if x_garage and rot_garage then
local object_garage = createObject(17950, x_garage, y_garage, z_garage, 0, 0, rot_garage)
local object_garagedoor = createObject(17951, xclose_gate, yclose_gate, zclose_gate, 0, 0, zrot_gate)
setElementData(object_garagedoor, "owner", owner)
setElementData(object_garagedoor, "doorstate", 0)
setElementData(object_garagedoor, "id", id)
if owner == "none" then
setElementData(object_garagedoor, "price", buyprice)
local blip = createBlip(x_garage, y_garage, z_garage, 32)
setElementData(blip, "id", id)
else
setElementData(object_garagedoor, "price", sellprice)
end
end
end
outputDebugString("Found: "..rows.." Garages")
end
end
addEvent("garagesystem:setupblips", true)
addEventHandler("garagesystem:setupblips", root, function(player)
local pname = getPlayerName(player)
local getownerships, rows = msql_gettbl("SELECT ownedby, garagepos FROM garage_system WHERE ownedby=?", pname)
if getownerships then
if rows >= 1 then
for i,v in pairs(getownerships) do
local x, y, z, r = tonumber(gettok(v.garagepos, 1, "|")), tonumber(gettok(v.garagepos, 2, "|")), tonumber(gettok(v.garagepos, 3, "|")), tonumber(gettok(v.garagepos, 4, "|"))
if x and z then
local blip = createBlip(x, y, z, 31, _, _, _, _, 255, _, _, player )
if blip then
setElementData(blip, "id", v.id)
end
end
end
end
end
end)
addEvent("garagesystem:buyGarage", true)
addEventHandler("garagesystem:buyGarage", root, function(price, id, garage)
if source ~= client then return end
local onbankMoney = vioGetElementData ( client, "bankmoney")
if onbankMoney then
if onbankMoney >= price then
local newmoney = onbankMoney - price
if newmoney then
vioSetElementData ( client, "bankmoney", newmoney)
local pname = getPlayerName(client)
local updateOwner = msql_settbl("UPDATE garage_system SET ownedby=? WHERE id=?", pname, id)
if updateOwner then
triggerClientEvent("garagesystem:closebuygui", client)
outputChatBox ( "Die garage gehört nun dir =)", source, 20, 100, 1 )
setElementData(garage, "owner", pname)
for i, v in pairs(getElementsByType("blip")) do
if getElementData(v, "id") == id then
destroyElement(v)
end
end
local x, y, z = getElementPosition(garage)
local blip = createBlip(x, y, z, 31, _, _, _, _, 255, _, _, client )
local updateSellprice, rows = msql_gettbl("SELECT * FROM garage_system WHERE id=?", id)
if updateSellprice then
local newprice = updateSellprice[1]["sellprice"]
if newprice then
setElementData(garage, "price", newprice)
end
end
end
end
else
outputChatBox ( "Überweisung fehlgeschlagen du hast nicht genug Geld auf dem konto!", source, 220, 100, 1 )
end
end
end)
addEvent("garagesystem:managedoor", true)
addEventHandler("garagesystem:managedoor", root, function(garage)
if source ~= client then return end
if moving == 1 then
outputChatBox ( "Warte bis das Tor die aktion ausgeführt hat!", source, 220, 100, 1 )
return
end
local x, y, z = getElementPosition(garage)
if getElementData(garage, "doorstate") == 0 then
if x and z then
local _, rot, _ = getElementRotation(garage)
moving = 1
setTimer(function()
moving = 0
end, 3000, 1)
local movement = moveObject ( garage, 2000, x, y, z+1.6, 0, rot+90, 0)
if movement then
setElementData(garage, "doorstate", 1)
end
end
elseif getElementData(garage, "doorstate") == 1 then
if x and z then
moving = 1
setTimer(function()
moving = 0
end, 3000, 1)
local movement = moveObject ( garage, 2000, x, y, z-1.6, 0, -90, 0)
if movement then
setElementData(garage, "doorstate", 0)
oldx, oldy, oldz = nil, nil ,nil
end
end
end
end)
addEvent("garagesystem:sellgarage", true)
addEventHandler("garagesystem:sellgarage", root, function(garage)
if source ~= client then return end
local sellprice = getElementData(garage, "price")
local onbank = vioGetElementData ( client, "bankmoney")
local newmoney = onbank + sellprice
if newmoney then
vioSetElementData ( client, "bankmoney", newmoney)
local id = getElementData(garage, "id")
local updateOwner = msql_settbl("UPDATE garage_system SET ownedby=? WHERE id=?", "none", id)
if updateOwner then
setElementData(garage, "owner", "none")
outputChatBox ( "Wir haben dir den betrag von: "..sellprice.." $ auf dein Konto Überwiesen.", source, 20, 100, 1 )
for i, v in pairs(getElementsByType("blip")) do
if getElementData(v, "id") == id then
destroyElement(v)
end
end
local x, y, z = getElementPosition(garage)
local blip = createBlip(x, y, z, 32, _, _, _, _, 255, _, _ )
local updateSellprice, rows = msql_gettbl("SELECT * FROM garage_system WHERE id=?", id)
if updateSellprice then
local newprice = updateSellprice[1]["buyprice"]
if newprice then
setElementData(garage, "price", newprice)
end
end
end
end
end)
Alles anzeigen
5. Jetzt geht ihr in den folgenden Pfad und öffnet clicksys_server.lua
Pfad: "ultimate/clicksys/clicksys_server.lua"
in dieser Datei sucht ihr folgende Zeilen:
direkt nach dieser Zeile fügt ihr folgendes ein:
-- garage System start
if isElement(clickedElement) then
local int_idelement = getElementModel(clickedElement)
if int_idelement == 17951 then
if getElementData(clickedElement, "owner") == getPlayerName(source) then
triggerClientEvent("garagesystem:interact_owned", source, clickedElement)
setElementData(source, "interacting", 1)
elseif getElementData(clickedElement, "owner") == "none" then
triggerClientEvent("garagesystem:interact_notowned", source, clickedElement)
setElementData(source, "interacting", 1)
else
outputChatBox ( "Die Garage wurde bereits gekauft!", source, 220, 100, 1 )
end
end
end
-- garage System end
Alles anzeigen
6. als nächstes geht ihr in die register_login_server.lua
Pfad: "ultimate/register_login/register_login_server.lua"
in der Datei sucht ihr folgende Zeilen:
unter dieser Zeile fügt ihr folgendes ein:
setElementData(player, "interacting", 0)
triggerEvent("garagesystem:setupblips", player, player)
in der gleichen Datei sucht ihr folgende Zeile:
setPlayerHudComponentVisible ( player, "all", false )
insertPlayerIntoLoggedIn ( pname, getPlayerIP(player), getPlayerSerial(player) )
und fügt folgendes drunter ein:
6. Jetzt öffnen wir die meta.xml und suchen folgende Zeilen:
<script src="mysql\mysql_start.lua" />
<script src="mysql\mysql_functions.lua" />
<script src="mysql\auto_update_db.lua" />
und fügt folgendes drunter ein:
<!-- garage System -->
<script src="garage_system/garage_client.lua" type="client" />
<script src="garage_system/garage_server.lua" type="server" />
7. ihr erstellt euch eine .sql Datei auf eurem Desktop und fügt folgendes ein:
-- --------------------------------------------------------
-- Host: 127.0.0.1
-- Server Version: 10.1.19-MariaDB - mariadb.org binary distribution
-- Server Betriebssystem: Win32
-- HeidiSQL Version: 9.4.0.5125
-- --------------------------------------------------------
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-- Exportiere Datenbank Struktur für ultimate_remake
CREATE DATABASE IF NOT EXISTS `ultimate_remake` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `ultimate_remake`;
-- Exportiere Struktur von Tabelle ultimate_remake.garage_system
CREATE TABLE IF NOT EXISTS `garage_system` (
`id` int(11) DEFAULT NULL,
`garagepos` varchar(255) DEFAULT '|0|0|0|0',
`doorpos` varchar(255) DEFAULT '|0|0|0|0',
`ownedby` varchar(255) DEFAULT 'none',
`buyprice` int(11) DEFAULT '0',
`sellprice` int(11) DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Exportiere Daten aus Tabelle ultimate_remake.garage_system: ~1 rows (ungefähr)
/*!40000 ALTER TABLE `garage_system` DISABLE KEYS */;
REPLACE INTO `garage_system` (`id`, `garagepos`, `doorpos`, `ownedby`, `buyprice`, `sellprice`) VALUES
(1, '|-2005.9000244141|213.10000610352|28.799999237061|180', '|-2005.9000244141|208.80000305176|28.299999237061|90', 'Zuck3rFr3i', 250000, 150000);
/*!40000 ALTER TABLE `garage_system` ENABLE KEYS */;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
Alles anzeigen
Dann speichert ihr die Datei und führt sie mit eurem SQL tool wie ZB: Navicat aus.
So viel spaß damit.
Sollten noch fragen auftreten oder solltet ihr probleme finden ist der Beitrag dafür gedacht.
//EDIT:
In der Datenbank müsst ihr ID,s für die garagen angeben wenn ihr ID,s doppelt habt wird der Spieler der die Garage mit der ID kauft 1x garage kostenlos kriegen also aufpassen.
in der Datanbank ist der Syntax bei den Positionen wie folgt:
|x|y|z|r
r = rotation
bei dem preis könnt ihr eintragen was ihr wollt solang es eine Numemr ist, bitte verwendet keine punkte bei den preisen!