Beiträge von Mann im Mond



    Eigentlich war vorgesehen das Script und die ganze Arbeit, die dahinter steckt, zu verkaufen. Mir ist es ein Rätsel, wie man in diesem Forum vernünftig einen Kauf abwickeln kann, zumindest habe ich das in der ganzen Zeit - trotz genug Interessenten - nicht geschafft und wurde sogar am Ende "verarscht". Vielleicht lag es auch an meiner Unfähigkeit, man weiß es nicht. Das war die einleitende Geschichte hierzu und für mich Grund genug das Script dann zumindest für jedermann verfügbar zu machen. Immerhin besser, als wenn es auf meiner Festplatte verstaubt, finde ich.


    Da ich in SA-MP nicht mehr wirklich sehr aktiv bin aufgrund der fehlenden Zeit, gebe ich keine Garantie auf Vollständigkeit oder ein komplett fehlerfreies Script. Laut meines Wissens ist es eigentlich fehlerfrei, wenn auch an der ein oder anderen Stelle noch nicht komplett ausgereift. Das Script wurde für einen Roleplayserver konzipiert und ist auch darauf komplett ausgelegt. Deswegen werden die enthaltenen Funktionen und alles was dazu gehört auch nicht für jeden hier zu gebrauchen oder sinnvoll sein. Davon abgesehen könnt ihr die Funktionen gerne alle hier nachlesen, es gibt noch viele weitere, aber die einigermaßen größten, sollten da alle aufgeführt sein.


    Ich biete keinen aktiven Support für dieses Script an, zumindest nicht ohne eine kleine Gegenleistung. Schließlich biete ich die ganze Arbeit schon umsonst an, da kann ich nicht noch jedem einzelnen das ganze Script zeigen oder Sachen ausbessern / hinzufügen. Ich hoffe das ist verständlich. Natürlich kann ich hier in diesem Thread dann einzelne Fragen beantworten, auch damit alle dann die Antwort auf einige Fragen wissen. Ob das Script nun scheiße oder gut ist, müsst ihr für euch entscheiden und ob ihr es gebrauchen könnt. Da ich weiß, wie das hier abläuft, ist mir auch klar, dass sicherlich im Laufe der Zeit von vielen die Credits des Scriptes entfernt werden und dann plötzlich jeder Author des Scriptes ist. Trotzdem bitte ich euch die Credits im Script zu lassen. Diese finden nur bei dem Befehl /script Erwähnung, den Rest könnt ihr beliebig verändern oder löschen. Also, wenn ihr diese Arbeit schätzt, lasst zumindest diesen kleinen Satz drin. Vielen Dank an alle, die sich daran halten.


    Abschließend bleibt noch zu sagen, dass das ganze Script über Mysql läuft und somit ihr auch dort alles einstellen müsst. Die Datenbank ist eventuell nicht komplett leer und einige Autos gehören noch anderen Leuten. Gebt einfach EINMALIG den Befehl "/resetall" ein und dann werden Besitzer und Namen usw. zurückgesetzt. Umparken müsst ihr die Autos dann selber. Bevor ihr den Server neustartet "/saveall" nicht vergessen, um alles zu speichert. Natürlichen werden auch so regelmäßig Sachen gespeichert, aber eben nicht immer dauerhaft! Der höchste Adminbefehl ist die 6 (Developer). Unter /help sind fast alle Befehle aufgelistet, wenn welche fehlen sollten, kann man diese in der Datenbank nachtragen. Bevor ich hier alles ausführlich erkläre, wie alles funktioniert, probiert erstmal selber oder schaut im Script nach, sonst dauert das hier zu lange. Das wars von meiner Seite aus, zumindest fürs Erste. Den Download-Link findet ihr hier abschließend noch hier:


    DOWNLOADLINK ENTFERNT. OHNE ERLAUBNIS DARF BIS AUF WEITERES KEIN DOWNLOADLINK MEHR ANGEBOTEN WERDEN


    Wenn ihr selbst einen Downloadlink anbieten wollt, dann fragt bitte vorher nach, dann führe ich diese hier auch auf

    Du meinst wohl eher mehrere Variablen auslesen, zumindest liest dein PHP Script aus und setzt keine Variablen. Egal was du meinst es ist beides prinzipiell möglich. Das Setzen ist dabei natürlich einfach als das auslesen. Hier mal am Beispiel von BlueG Mysql Plugin (R6). Wenn du R7 benutzen willst (threaded queries), dann geht das noch ein wenig anders, aber da gibts schon ein Tutorial dazu (http://forum.sa-mp.com/showthread.php?t=337810). Bei R6 sieht das noch so aus:


    Setzen:
    new
    string[90];
    format(string, sizeof(string), "UPDATE tabelle SET var1 = '%d', var2 = '%d', var3 = '%f'", var1, var2, var3);
    mysql_query(string);


    Auslesen mehrerer Variablen aus MySql mit sscanf
    new
    data[150];
    mysql_query("SELECT integer, string, float FROM tabelle");
    mysql_store_result();
    mysql_fetch_row_format(data,"|");
    sscanf(data, "p<|>dsf", integerVar, stringVar, floatVar);

    Hey,

    Code
    Zeile (313) : Nicht deklarierte (forward) Funktion : ("Krankenhaus")


    Was soll das bedeuten?
    Ich weiß nicht, was ich damit nafangen soll..
    oben noch ein #forward Krankenhaus oder wie!?


    ich denke du hast einen public function erstellt ohne diese zu deklarieren mit "forward". "#forward" wäre allerdings falsch, schau am Besten mal hier: http://wiki.sa-mp.com/wiki/Public_functions


    EDIT: Sorry, falsch geschaut, wurde natürlich bereits beantwortet.

    Zieht aber Ressourcen..


    Sicherlich, allerdings wird es niemals so oft aufgerufen wie OnPlayerUpdate. Da muss man eben überlegen, was besser ist. Genau weiß ich es nicht, allerdings bin ich mir nicht sicher, ob es wirklich nötig ist eine solche Überprüfung mehrmals pro Sekunde durchlaufen zu lassen.

    Das müsstest du selber schreiben und abfragen. Ich hab dafür mal OnPlayerUpdate genommen. Dadurch dass das sehr oft aufgerufen wird, ist das nicht die beste Lösung, vor allem muss es keineswegs so oft aufgerufen werden, damit es funktioniert. Auch wenn der Code einigermaßen optimiert ist, wäre es sinnvoller den Code nicht in OnPlayerUpdate sondern in einen Timer (jede Sekunde) mit einer Schleife durch alle Spieler zu stecken. Grundsätzlich sollte der Code aber so funktionieren:


    // Globale Variable erstellen ( ganz oben )
    new
    vAttached[MAX_VEHICLES];

    // OnPlayerUpdate / Schleife

    public OnPlayerUpdate(playerid)
    {
    new
    vehicleid = GetPlayerVehicleID(playerid);
    if (vehicleid) {
    new
    trailerid = GetVehicleTrailer(vehicleid);
    if (vAttached[vehicleid] != trailerid) {
    if (vAttached[vehicleid]) {
    CallLocalFunction("OnTrailerDetach", "ii", playerid, vehicleid);
    } else if (trailerid) {
    CallLocalFunction("OnTrailerAttach", "iii", playerid, vehicleid, trailerid);
    }
    vAttached[vehicleid] = trailerid;
    }
    }
    return 1;
    }


    // Nun kannst du folgende publics verwenden


    forward OnTrailerDetach(playerid, vehicleid);
    public OnTrailerDetach(playerid, vehicleid) {
    // Code
    }


    forward OnTrailerAttach(playerid, vehicleid, trailerid);
    public OnTrailerAttach(playerid, vehicleid, trailerid) {
    // Code
    }

    Das kann an einem Klammerfehler liegen. In deinen beiden Codeschnippseln erkenne ich soweit zwar keine außer im Ersten
    return 1;
    }
    am Ende, allerdings denke ich, dass du das einfach nur falsch hier reinkopiert hast und die Klammer irgendwo auch geöffnet wird. Ansonsten hilft vielleicht auch die Möglichkeit nach und nach deine Sachen, die du hinzugefügt hast zu entfernen, bis der Fehler nicht mehr auftaucht. Dann weißt du an welchem Teil es liegt.

    Genau, bei "deine commands" die MoveObject rein. Dann kommt der selbe Code wie bei mir raus. Hast du inwzischen ein paar Fehler beseitigen können? Falls nicht nochmal die Frage, ob du uns die Fehlerzeilen hier schicken könntest. Dann ist es einfacher dir dabei zu helfen.

    Zitat

    Muss alles was du mir geschickt hast in einer Zeile sein ?
    Dieser Code verschiebt sich irgendwie immer.


    Nein, meiner sollte schon einigermaßen vernünftig eingerückt gewesen sein, abgesehen von den bekannten Zeilensprüngen. Warum sicher der Code beim EInfügen verschiebt, weiß ich nicht. Dann musst du den Code eben selbstständig einrücken. Sollte aber angesichts der Länge kein größeres Problem sein.


    Zitat

    Also ich habe ein Script für die Tore gebastelt mit den gleichen Funktionen bis auf die Sache mit den wechselnden Befehlen ( auf / zu )
    Da hatte ich die Befehle /auf und /zu.


    Schön, was hat das aber mit den Fehlern zu tun? Wenn du die nicht beheben kannst, könntest du uns evt. die entsprechenden Zeilen (siehe Fehlermeldung) aufschreiben. Vielleicht hilft das.

    Schwer zu sagen, wenn alles in einer Zeile steht. Auf jeden Fall musst du natürlich das "pdtor1" von meinem MoveObject in "pdtor" umbenennen. Ich habe die Zeile nur irgendwo von weiter oben rauskopiert. Viele andere Fehler kann ich nicht wirklich nachvollziehen, da ich das Script nicht kenne und ich einfach Sachen aus dem Code von dir oben rauskopiert habe. Also ob die Funktion "isPlayerInFrakt(playerid,1)" tatsächlich in deinem Script existiert, weiß ich nicht.
    Fehler wie

    Zitat

    C:\Users\Felix\Downloads\SAMP\gamemodes\tutorial.pwn(281) : error 017: undefined symbol "SpielerSpeichern"
    C:\Users\Felix\Downloads\SAMP\gamemodes\tutorial.pwn(325) : error 017: undefined symbol "isPlayerAnAdmin"
    C:\Users\Felix\Downloads\SAMP\gamemodes\tutorial.pwn(334) : error 017: undefined symbol "strreplace"
    C:\Users\Felix\Downloads\SAMP\gamemodes\tutorial.pwn(358) : error 017: undefined symbol "ocmd_f"


    kommen nicht wirklich von meinem Code. Diese Variablen/Funktionen müssen irgendwo anders falsch definiert sein.


    Erneut der falsche Ansatz. Außerdem solltest du deinen Array natürlich auch setzen, wenn sich das Tor bewegt. Ansonsten bekommst du niemals den "Wechsel" hin.

    Es ist nicht nötig, dafür ein Spielerarray zu machen. Im Gegenteil würde das sogar zu weiteren Fehlern führen. Außerdem sollte man die Variable natürlich auch setzen, damit bei der erneuten Eingabe ein anderes Ereignis eintritt.


    // Oben
    new
    bool:pdTorOpen;


    // Im Befehl
    if(IsPlayerInRangeOfPoint(playerid,10,1183.0244140625, -938.5146484375, 41.824035644531))
    {
    if(!isPlayerInFrakt(playerid,1)) return SendClientMessage(playerid, ROT, "Du bist kein Mitglied des Staates.");
    if(!pdTorOpen)
    {
    // Tor öffnen und Boolean setzen
    MoveObject(pdtor1,1584.6999511719, -1638, 12.39999961853,5);
    pdTorOpen = true;
    }
    else
    {
    MoveObject(pdtor1,1584.6999511719, -1638, 2.39999961853,5);
    pdTorOpen = false;
    }
    }

    Deine Methode ist denke ich schon die beste für den Server. Nachteil von deiner ist eben, dass du für jede Tankstelle dann etwas im Script änder müsstest. Was also auch noch denkbar wäre, ist eine Schleife durch alle SBizz mit einer Positionsabfrage. Keine Ahung, wie das SBizz bei dir funktioniert, aber vom Prinzip her so.
    if(IsPlayerInRangeOfPoint(i,10.0,SBizzInfo[0][sbX,SBizzInfo[0][sbY],SBizzInfo[0][sbZ))
    Aber dabei hätte der Server natürlich mehr zu stemmen, aber du hättest Arbeit weniger.

    Dafür gibts mehrere Möglichkeiten. Die wahrscheinlich eleganteste wäre "text-align" und "line-height" zu benutzen. Dies funktioniert allerdings nur, wenn dein Text nur über eine Zeile geht und nicht übere mehrere. Dafür einfach dem umliegenden Container (div, a oder li oder was auch immer) das oben gezeigte Hintergrundbild geben und folgende Eigenschaften im CSS vergeben:
    height: /* Höhe des Hintergrundbildes */;
    width: /* Breite des Hintergrundbildes */;
    text-align: center; /* Horizontal zentriert */;
    line-height: /* Höhe des Containers/Hintergrundbildes (siehe oben) zur vertikalen Zentrierung */
    background: url(/* Hintergrundbild einbinden */);


    Natürlich kannst du auch deinem umliegenden Container, in der der Text steht, auch einfach ein padding nach oben geben und wieder "text-align: center;" zur horizontalen Zentrierung. Bei beiden Beispielen muss die Höhe und Breite fest gesetzt sein. Wenn du auch eine variable Breite haben möchtest, dann musst du ein wenig mehr schreiben.

    Machen werde ich mit Sicherheit keins, ich bezweifle auch, dass andere hier dies jemals einfach so machen würden. Bedanken brauchst dich also schonmal nicht. Allerdings kann ich dir sagen, wie man es machen könnte. Du könntest dich dann ransetzen und es versuchen und bei Problemen einfach hier nochmal melden. Ich denke das ist ein guter Kompromiss.


    Was du machen willst, ist natürlich möglich. Da ich nicht weiß, wie dein Script und deine Fraktionen usw. funktionieren und aufgebaut sind, kann ich es nur grob allgemein zeigen. Ein Lager ist auf jeden Fall ja nichts anderes wie ein paar Variablen die je nach Befehl gesetzt, hochgezählt, runtergezählt werden usw. Wenn du also sowohl Gegenstände und deren Menge speichern willst, brauchst du hierfür einen Array. WIe der genau aufgebaut ist, kommt auf deine Bedürfnisse an, aber man könnte es am einfachsten so lösen, dass du einfach den "Platz" in deinem Lager auf zb zwei Gegenstände beschränkst. Dann würde das so aussehen:
    enum StorageInfo
    {
    sType1,
    sAmount1,
    sType2,
    sAmount2
    }
    new
    sInfo[MAX_GANGS][StorageInfo];


    Beachte, dass es noch zwahlreiche andere Möglichkeiten gibt das zu lösen, ich habe einfach das genommen, was ich für am einfachsten halte das nachzumachen. Du hast also jetzt schonmal eine Grundstruktur. Nun kannst du einfach die entsprechenden Variablen hochzählen runterzählen, je nachdem, was ein User als Befehl eingibt. Wenn du zb in Slot1 was einlagern möchtest bei Gang "3", dann kann das so aussehen:
    sInfo[3][sType1] = DEIN_GEGENSTAND; // das "DEIN_GEGENSTAND" wird wahrscheinlich eine Zahl sein (z.B. 1 steht für Drogen, 2 steht fürMedkikits usw.
    sInfo[3][sAmount1] += EINGELAGERTE MENGE; // das "EINGELAGERTE_MENGE" wird sich nach der Eingabe richten, die der User macht bei dem Befehl


    Es geht also in jedem Fall darum Variablen zu setzen, wie fast überalll, mehr nicht.

    Das wird dann immer erst erstellt wenn das Hauptsächliche Design gecodet wurde.
    Das kann ich jetzt schlecht in Photoshop Simulieren :D


    Aber danke für deine Bewertung :)


    Wie bitte? Du machst ein Forendesign und sagst du machst den ganzen Inhalt erst wenn das "hauptsächliche" gemacht wurde. Was ist denn für dich bitte das hauptsächlich an einem Forum? Mit 100% Sicherheit nicht ein Header aus 5 Bildern. Gerade ein Forum und das gesammte Design lebt vom Inhalt, nicht nur von einem kleinen Header. Und warum kannst du das nicht in Photoshop "simulieren". Das kannst du genauso auch machen, wie den Header. Ich sehe da bei dir viel mehr ein Ueitproblem, dass du möglichst wenig Zeit investieren willst in das Ganze. Denn den Inhalt zu machen dauerst um Weiten länger als ein paar Bilder im Header zusammenzuführen.


    Die jetzigen Bewertungen sind meiner Meinung nach damit nicht wirklich etwas wert, denn keiner weiß, wie es später richtig aussehen wird. Das bisher gemacht nimmt nur vielleicht 5% des gesammten Forums ein.

    Die Größe änder ich nachher Automatisch beim Coden, ich slice nicht :)


    Schön, dass du wenigstens nicht die "Slice" Funtion von Photoshop nutzt. Trotzdem ist das die komplett falsche Herangehensweise ein vernünftiges Design zu machen. Warum macht man/du ein Design in Photoshop, wenn es später sowieso anders aussehen wird. Es wird nicht nur anders aussehen, da du die Größe änderst, sondern vielmehr, weil das Screendesign von dir keinen Inhalt besitzt. Nicht nur du hast diese Vorgehensweise, sondern ziemlich viele, die hier "designen". Zu einem Design gehört sowohl der AUFBAU (da hast du ja zumindest damit angefangen) als auch die Gestaltung des INHALTS (oder willst du später nur einspaltigen Text reinsetzen? Welche Schriftfarbe, welche Schrift (wie schon gesagt wurde gibt es MEHR als nur die Systemschriften wie Arial)? Wie viele Spalten? Wie sehen Links aus? Wie werden Bilder innerhalb des Textes positioniert? usw.). Zu sagen "mach ich später beim Umsetzen" passt hier somit einfach nicht. Entweder man ist hauptsächlich "Programmierer" und braucht dafür gar kein Photoshop oder eben man ist ein (wenn auch selbsternannter in den meisten Fällen hier) "Designer" und versucht möglichst viel (einige Sachen werden sich wahrscheinlich umsetzungstechnisch ändern müssen) direkt z.B. in Photoshop zu gestalten.


    Dann mach mir mal direkt die style.css fertig ;).


    Ein solches layout umzusetzen ist abgesehen vom Headerbild problemlos komplett mit CSS möglich. Selbst der IE kann Verläufe (wenn auch nur linear wie in deinem Beispiel) darstellen. Mehr kann man bei dir nicht beurteilen, weil das eigentlich kein wirklicher Entwurf ist.


    Genau aus diesem Grund macht es aus meiner Sicht auch keinen Sinn ein solches Design zu beurteilen, wenn man vielleicht 20% des Designs bisher nur sieht. "Schlicht und einfach" bedeutet außerdem nicht, dass man wie in diesem Falle einfach "wenig" macht, sondern dazu gehören viele andere Faktoren (z.B. Typo, Farben/ SW usw.), damit ein "schlichtes Design" gut aussieht.


    An deiner Stelle würde ich einfach nochmal von vorne (und zwar richtig anfangen). Du kannst deine jetzigen Ideen natürlich wieder mit einfliessen lassen, aber dann natürlich so, wie du es auch umsetzen kannst/willst. Das Ganze beginnt schon im richtigen Anlegen der Datei in Photoshop. Je nachdem welche Zielgruppe du definierst, erstellst du entweder eine Datei in 1024px Breite (ältere Leute haben auch noch solche Bildschirme) oder eben im inzwischen gängigen 1280px Breite. Möglichweise bietet sich bei dir auch der Einsatz eines Rasters an (http://www.960.gs). Diese Seite bietet einige, das Beliebteste hat wie der Name schon sagt eine Breite von 960px Breite (auch auf 1024px Monitoren problemlos anschaubar und äußerst flexibel bei den Spalten). Zur Schrift kann ich dir diese Seite empfehlen, die einige kostenlose Schriften in allen Webschriftformaten (auch für IE, Iphone, Ipad usw.) aufzeigt und auch Einbaubeispiele dabei hat (@font-face): http://www.fontsquirrel.com/fontface