Nutze doch bitte die PAWN Box für solch Quellcodes, danke!
Ja, also.. ich nehme an dass du die soweit die neuste Version von BlueG nutzt, so wie fast jeder heutzutage.
Von daher, wird das so nicht funktionieren.
Schicke anstatt deinem Funktionsaufruf, einen Query mit einer Aufforderung an die Datenbank, eine Spalte zu markieren unter wie folgtem Namen: "playername". In dem Callback, arbeitest du dann mit dem Cache der dir zur Verfügung steht.
Früher ging das noch .. bei R5 habe ich das mal so angewendet mit mysql_num_rows(); unter der gleichen Funktion.
Sprich, so wie ich es dir Oben geschickt habe.
Beiträge von Kasakow
-
-
Ok dachte ich mir
auf jeden Fall.
Brauche aber die Funktion so dass er das Return
Was soll es denn für eine Funktion werden?
Ich bezweifle es nämlich, dass du was damit Anfangen kannst, wenn er bei beiden Reihen Abfragen den Zahlenwert 1 zurückgibt. -
Leider führt er den Code nicht ordnungsgemäß aus.
Auch wenn ich einen fehlenden Datensatz suchen möchte, gibt er mir die Fehlermeldung nicht aus.
Ich möchte dass das System mir pro Seite im Dialog, 10-20 Einträge Zeigt vom Spieler.
Ich habe auch gemerkt, das der Code ziemlich Recourcenfressend ist, die Dateigröße wurde auf einen Schwung viel größer.Quellcode:
ocmd:pp(playerid, params[])
{
if(pInfo[playerid][pAdmin] < 6)return 1;
new query[256];
if(sscanf(params, "s", query))return SCM(playerid, COLOR_GREY, "Befehl: /pp [Name]");
mysql_format(handle, query, sizeof query, "SELECT * FROM playerprotocol WHERE Name='%e'", query),
mysql_pquery(handle, query, "PlayerQuery", "d", PLAYER_QUERY_PPROTOCOL);
return 1;
}case PLAYER_QUERY_PPROTOCOL:
{
if(!rows)return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
SetPVarInt(playerid, "ProtocolStep", rows);
new str[1024];
str = "Datum\tUhrzeut\tInhalt\n";
for(new i;i<rows;i++)
{
cache_get_value_name(i, "Datum", ProtocolRead[playerid][i][0], 600),
cache_get_value_name(i, "Uhrzeit", ProtocolRead[playerid][i][1], 600),
cache_get_value_name(i, "Inhalt", ProtocolRead[playerid][i][2], 600);
if(i <= 9)
{
if(strlen(ProtocolRead[playerid][i][2]) > 0)
{
format(str, sizeof str, "%s%s\t%s\t%s\n", str, ProtocolRead[playerid][i][0], ProtocolRead[playerid][i][1], ProtocolRead[playerid][i][2]);
}
}
}
ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", "");
}case D_PP:
{
if(!response || listitem || GetPVarInt(playerid, "ProtocolStep") >= countProtoStep(playerid))
{
SCM(playerid, COLOR_GREY, "Du hast entweder das Fenster geschlossen oder es sind keine weiteren Einträge vorhanden!");
return 1;
}
query = "Datum\tUhrzeit\tInhalt\n";
for(new k = GetPVarInt(playerid, "ProtocolStep"), i; i<k+10;i++)
{
format(query, sizeof query, "%s%s\t%s\t%s", ProtocolRead[playerid][i][0], ProtocolRead[playerid][i][1], ProtocolRead[playerid][i][2]),
SetPVarInt(playerid, "ProtocolStep", GetPVarInt(playerid, "ProtocolStep") + 1);
}
ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", query, "Schließen", "");
}stock countProtoStep(playerid)
{
new counter;
for(new i;i<sizeof ProtocolRead;i++)
{
if(strlen(ProtocolRead[playerid][i][2]) > 0)counter ++;
}
return counter;
} -
Schöne dargestellte Grafik!
Die Frage die ich mir persönliche Stelle, wie soll ich das Umsetzen? Also bin gerne bereit mitzulesen und dann etwas rum zuprobieren. Klingt zwar komplexer, aber umso mehr sinnvolles Zeug in meiner Kugel rumschwirrt, um so besser! -
Weil du den Cache erst in einem Callback auswerten lassen kannst.
Aber noch vorab, du brauchst bei einer zweiseitigen Abfrage, kein return verwenden.
Weil er wird bei dieser Abfrage Methode nicht das andere von beiden auch noch ausführen.Daher schreibe es mal so:
new query[128];
mysql_format(handle, query, sizeof(query), "SELECT ID FROM Accounts WHERE Name = '%e'", Name),
mysql_pquery(handle, query, "Callback", "d", playerid); //d oder i für einen runden Zahlenwertforward Callback(playerid); //Kann beliebig umbenannt werden
public Callback(playerid)
{
new rows;
cache_get_row_count(rows);
if(rows == 0)
{
}
else
{
}
} -
Ich kompiliere mein Skript standardmäßig mit Pawno.
-
Also der Hauptgrund ist ja eigentlich, das mein Prozessor einfach zu lange braucht, wenn das Skript größer ist.
-
Biete mich immer noch an, falls Interesse besteht, weiste du ja, wo du mich findest.
-
Ich sage mal so, ich bin wie erwähnt in ferner Zukunft via Remote Desktop am Skripten und möchte dass man ein Passwort braucht um auf das Skript zuzugreifen.
-
Ich habe leider gerade einen Impulskauf getätigt und mir eine Lizenz für die PawnIT IDE geholt, warte gerade noch auf den Entwickler dass er sich mit mir in Kontakt setzt bezüglich meines Erhalts der Lizenz.
Finde es wirklich Schade, dass das Programm nicht weiter entwickelt wird. Hat jemand eine alternative für mich? Ich benutze in ferner Zukunft einen Windows Dedicated Server und und kompiliere auch auf dem System, ich möchte aber so ein tolles Features wie bei der PawnIT IDE mit der verschlüsselten PAWN Datei? Kennt da jemand was ähnliches? -
Frage mich gerade wieso du das Fahrzeug in eine neu erstellte Sektorenbezogene Variable lädst und nicht in das Array mit der Enumerator Verbindung.
Kannst du mir folgen?
-
Wenn du dich bitte etwas konkreter und verständlicher ausdrücken würdest, dann könnte man dich eventuell besser nachvollziehen. Weil aufgrund der Unklarheit bezüglich des Sachverhaltes, kann ich dir zum Beispiel, nicht helfen.
-
Filterscript ~ Vehicle Attach Editor
Probiere das mal aus. -
Ich habe gelesen, dass bei dem TakeDamage Callback, die Health nicht aktuell sind, also noch die vor dem Schuss.
Meint ihr, das würde so einwandfrei funktionieren oder gibt es noch saubere Methoden?Aktuelle Idee:
if(AdminDuty(playerid) == 1)
{
new Float:myhealth;
GetPlayerHealth(playerid, myhealth);
return SetTimerEx("SchutzLeben", 50, false, "df", playerid, myhealth);
}public SchutzLeben(playerid, Float:oldhealth)
{
SetPlayerHealth(playerid, oldhealth);
return 1;
} -
Tatsache, habe es gerade ausprobiert.
Habe gerade ein bisschen rumprobiert.
killerid kannst du auch nutzen.Aber, probier mal das aus.
new LastDriver[MAX_VEHICLES];public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate&PLAYER_STATE_DRIVER)
{
if(IsValidVehicle(GetPlayerVehicleID(playerid)) //Weil beim Tod auch die State auf Driver gewechselt wird.
{
LastDriver[GetPlayerVehicleID(playerid)] = playerid;
}
}
}public OnPlayerExitVehicle(playerid, vehicleid)
{
LastDriver[vehicleid] = INVALID_VEHICLE_ID;
return 1;
}public OnVehicleDeath(vehicleid, killerid)
{
if(IsPlayerConnected(LastDriver[vehicleid]))
{
if(killerid != LastDriver[vehicleid])
{
SendClientMessage(LastDriver[vehicleid], -1, "Dein Fahrzeug wurde zerstört.");
}
else
{
SendClientMessage(killerid, -1, "Du hast ein fremdes Fahrzeug zerstört.");
}
}
return 1;
}//bei Ongamemodeinit
for(new i = MAX_VEHICLES, k; k < i; k++)
{
LastDriver[k] = INVALID_PLAYER_ID;
} -
@JacLos
Du kannst es z.B so machen.//EDIT
stock GetDriverID(id)
{
for(new i;i<GetMaxPlayers();i++)
{
if(!IsPlayerConnected(i) || GetPlayerState(i) != PLAYER_STATE_DRIVER)continue;
if(GetPlayerVehicleID(i) == id)return i;
}
return INVALID_PLAYER_ID;
}public OnVehicleDeath(vehicleid, killerid)
{
new playerid = GetDriverID(vehicleid);
if(playerid != INVALID_PLAYER_ID)
{
//In dem Fahrzeug sitzt jemand drinne, playerid ist der Fahrer
}
else
{
//Das Fahrzeug hat keinen Fahrer
}
return 1;
} -
Wieso wird bei dieser Funktion das zuletzt erstellte Fahrzeug, nicht zurück an seinen Herkunftsort gebracht?
ocmd:rac(playerid)
{
if(pInfo[playerid][pAdmin] < 3)return 1;
if(AdminDuty(playerid) == 0)return SCM(playerid, COLOR_LIGHTRED, "Du bist nicht im Dienst!");
for(new i;i<GetVehiclePoolSize();i++)
{
if(IsVehicleEmpty(i) == 0)continue;
SetVehicleToRespawn(i);
}
new string[75];
format(string, sizeof string, "Teammitglied %s respawnt alle unbesetzten Fahrzeuge.", getName(playerid)),
SCMTA(COLOR_LIGHTBLUE, string),
playerProtocol(playerid, "hat alle unbesetzten Fahrzeuge respawnt");
return 1;
} -
Wie könnte ich alle meine zugeteilten PVars auf einmal zurücksetzen ohne jede einzeln zu Tippen, gibt es da eine Möglichkeit? Finde nichts gescheites im Internet.
-
Ah ja, danke. Ich hatte die Situation erst kürzlich mit einer anderen Variable.
Mir ist noch was in den Sinn gekommen, eventuell könnte man ja Silent Aim aufspüren.Meine Idee war es mit dem Callback OnPlayerWeaponShot zu arbeiten.
Wenn man die Position vergleichen tut, mit der Position wo der Spieler eigentlich steht, könnte man sowas doch eigentlich Detecten oder was meint ihr? Natürlich würde man die Frames und die Latenz berücksichtigen aber sobald es zu oft vorkommt, eine Warnung rausschicken. -
Jemand eine Idee wieso ich das Ticket nur schließen kann wenn ich schon im LiveChat bin?
Wenn ich ein Ticket erstellt habe und es auch noch keiner angenommen hat, macht er gar nichts beim /closeticket Befehl, wenn ich im LiveChat Modus bin, schließt er es Ordnungsgemäß.Quellcode
ocmd:ticket(playerid, params[])
{
if(pInfo[playerid][pTicketCreate] == 1 || pInfo[playerid][pTicketID] != INVALID_PLAYER_ID)return SCM(playerid, COLOR_GREY, "Du bist bereits im TicketChat oder hast eins erstellt.");
new inhalt[220];
if(sscanf(params, "s", inhalt))return SCM(playerid, COLOR_GREY, "Befehl: /ticket [Ticket Inhalt] MAX 200 Zeichen.");
if(strlen(inhalt) > 200)return SCM(playerid, COLOR_GREY, "Du kannst maximal 200 Zeichen verwenden.");
new day, month, year, hour, minute, second;
getdate(year, month, day),
gettime(hour, minute, second),
pInfo[playerid][pTicketCreate] = 1,
format(pInfo[playerid][pTicketMSG], 200, "%s", inhalt),
format(pInfo[playerid][pTicketDate], 50, "%02d.%02d.%02d | %02d:%02d:%02d ", day, month, year, hour, minute, second),
format(inhalt, sizeof inhalt, "%s hat ein Ticket erstellt. /sticket um alle Tickets anzuzeigen.", getName(playerid)),
SendAdminMessage(COLOR_TICKET, inhalt),
SCM(playerid, COLOR_TICKET, "Du hast ein Ticket erstellt. Die Teammitglieder haben eine Nachricht erhalten."),
SCM(playerid, COLOR_TICKET, "Du kannst deine Anfage jederzeit via /closeticket zurückziehen.");
return 1;
}ocmd:closeticket(playerid)
{
if(pInfo[playerid][pTicketCreate] == 0 && pInfo[playerid][pTicketID] == INVALID_PLAYER_ID)return 1;
if(pInfo[playerid][pTicketID] != INVALID_PLAYER_ID)SCM(pInfo[playerid][pTicketID], COLOR_TICKET, "Deine Ticket Verbindung wurde unterbrochen, Grund: Partner hat den Reportmodus verlassen.");
pInfo[pInfo[playerid][pTicketID]][pTicketID] = INVALID_PLAYER_ID,
pInfo[playerid][pTicketID] = INVALID_PLAYER_ID,
pInfo[playerid][pTicketCreate] = 0,
SCM(playerid, COLOR_TICKET, "Du hast das Ticket geschlossen/gelöscht.");
return 1;
}