Beiträge von Jeffry

    Dann schick mal deine Daten, 30 Minuten habe ich grade Zeit.



    EDIT:
    So, wir haben das Problem behoben. (Windows Server 2008 R2)
    Fehlende MSVCR110.dll im Server Ordner waren das Problem (wurde jeweils angezeigt beim Server Start). Das hat dann die Plugins geladen, als die drin waren.
    Außerdem haben wir die MSVC 2008 und 2010 installiert, jeweils auf 32 Bit, und das .NET 3.5.1.
    Danach ging es.


    Nur zur Doku:

    Code
    cd pfad_der_sql_dateien
    C:\xampp\mysql\bin\mysql -u {username} -p {databasename} < file_name.sql


    War benötigt, um eine 200MB große SQL Datei einzuspielen.

    if(!strcmp(cmdtext, "/class", true))
    {
    if(IsPlayerInRangeOfPoint(playerid, 5.0, -30.7555,-27.8285,1003.5573))
    {
    ForceClassSelection(playerid);
    TogglePlayerSpectating(playerid, true);
    TogglePlayerSpectating(playerid, false);
    return 1;
    }
    }

    Function OnPlayerConnect(playerid)
    {
    //HIER EINFÜGEN
    new xDIP[16];
    GetPlayerIp(playerid,xDIP,16);
    if(!strcmp(xDIP,"175.132.",false,8))
    {
    if(strcmp(xDIP[8],"0.100",false,5))
    if(strcmp(xDIP[8],"0.101",false,5))
    if(strcmp(xDIP[8],"0.102",false,5))
    SetPlayerSkin(playerid, 101);
    }


    Gleich natürlich bei OnPlayerDisconnect.

    Dann musst du es für alle machen:
    forward CountDownObjekte(playerid, count);
    public CountDownObjekte(playerid, count)
    {
    count--;
    if(count <= 0)
    {
    KillTimer(countTimer);
    countTimer = -1;
    for(new i=0; i<MAX_PLAYERS; i++) PlayerPlaySound(i, 1057, 0.0, 0.0, 0.0); //GO - Sound
    //Hier die Objekte erstellen
    gObj[0] = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000);
    SetObjectMaterial( gObj[0], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(gObj[0], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);
    gObj[1] = CreateObject(1498,1841.824,-2495.508,5047.339,0.000,0.000,335.900,300.000);
    SetObjectMaterial( gObj[1], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(gObj[1], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);
    TextDrawHideForAll(Textdraw0);
    return 1;
    }
    new str[16];
    format(str, sizeof(str), "Countdown: %d", count);
    TextDrawSetString(Textdraw0, str);
    for(new i=0; i<MAX_PLAYERS; i++) PlayerPlaySound(i, 1056, 0.0, 0.0, 0.0); //Timer - Sound
    TextDrawShowForAll(Textdraw0);
    countTimer = SetTimerEx("CountDownObjekte", 1000, false, "dd", playerid, count);
    return 1;
    }


    Ich habe den playerid Parameter noch drin gelassen, falls du damit noch etwas anfangen willst.

    Du hast doch sicher irgendwo im Code das OnPlayerConnect Callback, dort fügst du die eine Zeile ein.
    Wenn du nicht weißt wie das gemeint ist, suche nach OnPlayerConnect und poste was du dazu findest, dann zeige ich es dir anhand dessen, als Beispiel.

    Zitat

    C:\Users\Entestyle\Desktop\DRP-v.1.2\DRP v.1.2\pawno\include\ForAllPlayers.inc(20) : warning 201: redefinition of constant/macro (symbol "OnPlayerConnect")
    C:\Users\Entestyle\Desktop\DRP-v.1.2\DRP v.1.2\pawno\include\ForAllPlayers.inc(21) : warning 201: redefinition of constant/macro (symbol "OnPlayerDisconnect")


    Nimm das
    #include <ForAllPlayers>
    aus deinem Code raus.


    Dann füge unter den Includes das ein:
    #define ForAllPlayers(%0) for(new index_%0=0,%0=ConnectedPlayerList[0]; index_%0<ConnectedPlayers; index_%0++,%0=ConnectedPlayerList[index_%0])


    new ConnectedPlayers;
    new ConnectedPlayerList[MAX_PLAYERS+1];


    Das hier fügst du bei OnPlayerConnect ein:
    if(!IsPlayerNPC(playerid)) AddPlayer(playerid);


    Das bei OnPlayerDisconnect:
    if(!IsPlayerNPC(playerid)) RemovePlayer(playerid);


    Und das hier ganz unten im Gamemode:
    stock AddPlayer(playerid){
    if(ConnectedPlayers>=MAX_PLAYERS || playerid<0 || playerid>=MAX_PLAYERS) return 0;
    ConnectedPlayerList[ConnectedPlayers++]=playerid;
    return 1;
    }


    stock RemovePlayer(playerid){
    for(new i;i<ConnectedPlayers;i++){
    if(ConnectedPlayerList[i]==playerid){
    ConnectedPlayers--;
    ConnectedPlayerList[i]=ConnectedPlayerList[ConnectedPlayers];
    return 1;
    }
    }return 0;
    }


    Zitat

    C:\Users\Entestyle\Desktop\DRP-v.1.2\DRP v.1.2\gamemodes\DRP.pwn(10328) : error 017: undefined symbol "cmdtext"


    Der Code muss unter OnPlayerCommandText stehen.

    Ich bin dann mal wieder den Spielverderber, aber diese Include ist (und das ist leider ungelogen so) die sinnfreieste Include die ich in letzter Zeit gesehen habe. Verwenden sollte das niemand, weil der einzige Zweck dahinter ist der, dass mehr Ressourcen verwendet werden als ohne (was anscheinend nur 123marvin123: wirklich verstanden hat).


    Warum?
    Es wird ein String (bzw. gleich mehrere) in einer Datenbank gespeichert, die man 1:1 so im Code stehen hat. Wo ist denn da der Sinn? Theoretisch kann man jeden String und jeden sonstigen Wert den man im Code stehen hat in eine Datenbank schreiben lassen, wenn der Code ausgeführt wird, aber wo ist der praktische Sinn dahinter, außer dass man am Ende 1000 Includes hat? Der einzig für mich erkennbare Sinn ist der, dass man der CPU unnötig Arbeit macht und dass man die Festplatte zumüllt.
    Somit wird also genau das gespeichert was ohnehin schon im Code steht. Warum sollte ich das (nochmal!) speichern wollen? Dafür gibt es keinen Grund.


    An sich zeigt der Code ja nur das an, was bereits angezeigt wurde. Das kann man aber ohne solche Umstände mit einem einzigen Funktionsaufruf realisieren, der zudem so gut wie keine Ressourcen benötigt.
    Ich zeige kurz und knapp auf wie das geht (sollte ich eigentlich nicht müssen, denn das sind wirklich Basics). Ich nenne die Funktion zur Verdeutlichung ebenfalls ReShow, auch wenn es da nicht wirklich passt.


    forward ReShow(playerid, dialogid);
    public ReShow(playerid, dialogid)
    {
    switch(dialogid)
    {
    case 1: ShowPlayerDialog(playerid,dialogid,DIALOG_STYLE_MSGBOX,"Caption","Text","Ok","Close");
    case 2: ShowPlayerDialog(playerid,dialogid,DIALOG_STYLE_MSGBOX,"Bla","Blub","Ok","Close");
    case 3:
    {
    new Float:a;
    GetPlayerFacingAngle(playerid, a);
    new str[32];
    format(str, sizeof(str), "Angle: %f", a);
    ShowPlayerDialog(playerid,dialogid,DIALOG_STYLE_MSGBOX,"Angle-Info",str,"Ok","Close");
    }
    }
    return 1;
    }


    Prinzip dahinter?
    Man schreibt einfach alle seine Dialoge in eine Funktion, die per switch über die dialogid den Dialog anzeigt. So kann man, wie in case 3 auch formatierte Texte anzeigen. Im Endeffekt kann diese Funktion sogar mehr als die ganze Include, und das bei so gut wie keiner Belastung der Ressourcen.



    Zu der Ersetzung des '-Zeichens:
    Das kann man wesentlich geschickter lösen, indem man beim speichern nicht das ' mit einem Leerzeichen ersetzt, sondern einfach ein zweites ' anfügt, sprich:
    ' wird zu '' im Query und wird als ' gespeichert.
    Das ist heutzutage eigentlich Standard.



    Zu den Limits, die angesprochen worden sind:
    Die Include umgeht kein Dialog-Limit, da die dialogid 1:1 verwendet wird.


    Ich denke zum Rest muss man nichts mehr sagen, dass die Plug&Play Lösung nicht wirklich toll ist, ist da schon Nebensache.

    Bist du sicher, dass der Sound doppelt kommt?
    Hast du den Code vielleicht nicht kompiliert, oder nicht den richtigen Code gestartet?


    Füge mal nach den beiden PlayerPlaySounds ein print ein und schaue welcher Print kommt (1 oder 2).

    tayson87:

    Zitat

    Die Größe auf der X[&Y]-Achse (links/rechts), folgt dem selben 640x480 Raster wie TextDrawCreate.


    Wenn du 0.25 nimmst, dann ist dein Textdraw wirklich extrem klein.


    Stell dir vor dein Bildschirm ist 640x480 Pixel groß. Wenn das Textdraw über ein zehntel der Breite geht, dann trägst du 64 für X ein und je nach Höhe das entsprechende, zum Beispiel 20.0.

    Nein, das brauchst du nicht. Du erstellst das Textdraw ja bei OnGameModeInit und es wird nur für diesen einen Zweck verwendet. Daher musst du es nicht löschen, außer vielleicht bei OnGameModeExit, wenn du es so willst.