Nutze INSERT OR IGNORE um nur einmal einen Wert einzufügen.
Beachten, dass es dazu einen primary key geben muss.
Beispiel siehe hier: stackoverflow.com/questions/2717590/sqlite-upsert-on-duplicate-key-update
Nutze INSERT OR IGNORE um nur einmal einen Wert einzufügen.
Beachten, dass es dazu einen primary key geben muss.
Beispiel siehe hier: stackoverflow.com/questions/2717590/sqlite-upsert-on-duplicate-key-update
Ich muss den Code Abschnitt aber in OnFilterScriptInit verwenden, weshalb es dann jedes mal, sobald ich das FS lade inserted wird.
Habe sowas versucht, scheint aber nicht zu funktionieren @Jeffry
db_free_result(db_query(db_handle, "CREATE TABLE IF NOT EXISTS `Settings`(`pSetting` INTEGER DEFAULT 1)"));
Deshalb das INSERT OR IGNORE Query zusammen mit einem primary key (id zum Beispiel).
Das wird dann nur ausgeführt, wenn die Zeile mit der id nicht existiert.
INSERT OR IGNORE INTO Settings VALUES (0, 0);
Die Tabelle hat dann zwei Spalten, einmal id als primary key und als zweites die pSetting.
Okay gut, verwende das nun und es wird inserted (auch nur einmalig wie gewollt), aber scheinbar funktioniert das laden des Wertes nicht mehr ordnungsgemäß, was habe ich falsch gemacht?
Console:
Successfully created a connection to "ServerSettings.db".
INSERT OR IGNORE INTO `Settings` VALUES(0, 1)
SELECT * FROM `Settings` WHERE `pSetting` = '0'
Tabelle:
ID 0, pSetting 1
Code:
public OnFilterScriptInit()
{
new DBResult: query,string[144];
query = db_query(db_handle, string);
// Create a connection to the database
if((db_handle = db_open("ServerSettings.db")) == DB:0)
{
// Error
print("Failed to open a connection to \"ServerSettings.db\".");
SendRconCommand("exit");
}
else
{
// Success
db_free_result(db_query(db_handle, "CREATE TABLE IF NOT EXISTS `Settings`(`ID` INTEGER PRIMARY KEY AUTOINCREMENT, `pSetting`)"));
print("Successfully created a connection to \"ServerSettings.db\".");
}
format(string, sizeof string, "INSERT OR IGNORE INTO `Settings` VALUES(0, 1)");
db_free_result(db_query(db_handle, string));
printf(string);
format(string, sizeof(string), "SELECT * FROM `Settings` WHERE `pSetting` = '%d'", aSetting);
query = db_query(db_handle, string);
new Field[5];
db_get_field_assoc(query, "pSetting", Field, 5);
aSetting = strval(Field);
printf(string);
return 1;
}
format(string, sizeof(string), "SELECT * FROM `Settings` WHERE `pSetting` = '%d'", aSetting);
Zu
format(string, sizeof(string), "SELECT * FROM `Settings` WHERE `id` = '0'");
Kleiner einwand:for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
(Wichtig ist das <=)
GetPlayerPoolSize gibt die höchste Spieler ID zurück, wenn du < benutzt wird der letzte Spieler (der mit der höchsten ID) nie ausgewählt.
Hab das ganze mal getestet. Einziges Problem ist nur das wir zwei Spieler waren und alle zwei waren Innocent. Es sollte jedoch einen Traitor geben. Wie kann ich das ganze Realisieren?
Vielen Dank im Voraus!
ich hab aus meinem ersten Script das Waffenlager system übernommen, aber wenn ich jz eine Waffe in der Kammer (welche Textdraws sind) anklicke passiert nichts, genauso wie wenn ich Beenden drücke... es ist aber alles gescriptet.. bei OnPlayerClickPlayerTextDraw.
public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
{
new WaffenString[200];
if(playertextid == PlayerText:INVALID_TEXT_DRAW)
{
WaffenlagerVerstecken(playerid);
CancelSelectTextDraw(playerid);
}
if(playertextid == Beenden[playerid])
{
WaffenlagerVerstecken(playerid);
CancelSelectTextDraw(playerid);
}
if(playertextid == Waffe1[playerid])
{
switch(SpielerInfo[playerid][Fraktion])
{
case 1:
{
GivePlayerWeapon(playerid, 24, 150);
format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}Deagle{FEFEFE} genommen", SpielerName(playerid));
SendClientMessage(playerid, Weiss, "{00FF00}Deagle{FEFEFE} erhalten");
SAPDWaffenEntnahmeSpeichern(WaffenString);
}
case 2:
{
GivePlayerWeapon(playerid, 24, 150);
format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}Deagle{FEFEFE} genommen", SpielerName(playerid));
SendClientMessage(playerid, Weiss, "{00FF00}Deagle{FEFEFE} erhalten");
BwWaffenEntnahmeSpeichern(WaffenString);
}
case 3:
{
GivePlayerWeapon(playerid, 30, 250);
format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}AK-47{FEFEFE} genommen", SpielerName(playerid));
SendClientMessage(playerid, Weiss, "{00FF00}AK-47{FEFEFE} erhalten");
TerrorWaffenEntnahmeSpeichern(WaffenString);
}
}
}
if(playertextid == Waffe2[playerid])
{
switch(SpielerInfo[playerid][Fraktion])
{
case 1:
{
GivePlayerWeapon(playerid, 29, 300);
format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}MP5{FEFEFE} genommen", SpielerName(playerid));
SendClientMessage(playerid, Weiss, "{00FF00}MP5{FEFEFE} erhalten");
SAPDWaffenEntnahmeSpeichern(WaffenString);
}
case 2:
{
GivePlayerWeapon(playerid, 27, 50);
format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}Combat-Shotgun{FEFEFE} genommen", SpielerName(playerid));
SendClientMessage(playerid, Weiss, "{00FF00}Combat-Shotgun{FEFEFE} erhalten");
BwWaffenEntnahmeSpeichern(WaffenString);
}
case 3:
{
GivePlayerWeapon(playerid, 31, 250);
format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}M4{FEFEFE} genommen", SpielerName(playerid));
SendClientMessage(playerid, Weiss, "{00FF00}M4{FEFEFE} erhalten");
TerrorWaffenEntnahmeSpeichern(WaffenString);
}
}
}
}
Moin
Warum funktioniert MapAndreas bei mir nicht richtig?
stock TeleportPlayerToRandomPosition(playerid)
{
new Float:Z;
new Float:rx1=((frandom((floatabs(MAP_WORLDBOUNDS[0][0]-MAP_WORLDBOUNDS[0][1])))+MAP_WORLDBOUNDS[0][1]));
new Float:ry2=((frandom((floatabs(MAP_WORLDBOUNDS[0][2]-MAP_WORLDBOUNDS[0][3])))+MAP_WORLDBOUNDS[0][3]));
MapAndreas_FindZ_For2DCoord(rx1,ry2,Z);
SetPlayerPos(playerid,rx1,ry2,Z);
}
Ich werde zwar teleportiert, jedoch ist die Z Koordinate irgendwie immer unter der Erde, woran liegt das?
Guten Tag,
da ich mich gerade daran probiere einen TTT Server für Samp zu Scripten hätte ich mal 2 Fragen.
Frage 1: Ist es möglich anzufragen ob ein Spieler afk ist und wie lange er das ist? (Ps: Die Include die ich hier im Forum gefunden habe funktioniert bei mir irgendwie nicht)
Frage 2:
Sobald die Runde anfängt wird dem Spieler der Wert: SpielGestartet = 1; zugewiesen.
Nun habe ich einen Globalen Timer erstellt. In diesem soll Abgafragt werden ob alle Spieler tot sind, also wenn der Wert Tot =1; bei allen Spielern gesetzt ist wo SpielGestartet = 1 ist.
Das habe ich ja realisiert bekommen. Meine Frage nun, wie kann ich abfragen wie viele Spieler den werr Tot = 1 haben?
Ich möchte nämlich das wenn nur noch ein Spieler Lebt das Spiel beendet wird da ja kein anderer mehr lebt um den letzten überlebenden zu killen.
Vielen Dank im Voraus!
Alles anzeigenMoin
Warum funktioniert MapAndreas bei mir nicht richtig?
Cstock TeleportPlayerToRandomPosition(playerid) { new Float:Z; new Float:rx1=((frandom((floatabs(MAP_WORLDBOUNDS[0][0]-MAP_WORLDBOUNDS[0][1])))+MAP_WORLDBOUNDS[0][1])); new Float:ry2=((frandom((floatabs(MAP_WORLDBOUNDS[0][2]-MAP_WORLDBOUNDS[0][3])))+MAP_WORLDBOUNDS[0][3])); MapAndreas_FindZ_For2DCoord(rx1,ry2,Z); SetPlayerPos(playerid,rx1,ry2,Z); }Ich werde zwar teleportiert, jedoch ist die Z Koordinate irgendwie immer unter der Erde, woran liegt das?
wird das plugin geladen , hast du die SAfull.map im scriptfile ordner und wird das ganze aich initalisiert unter OnGameModeInit
via MapAndreas_Init ?
Alles anzeigenGuten Tag,
da ich mich gerade daran probiere einen TTT Server für Samp zu Scripten hätte ich mal 2 Fragen.
Frage 1: Ist es möglich anzufragen ob ein Spieler afk ist und wie lange er das ist? (Ps: Die Include die ich hier im Forum gefunden habe funktioniert bei mir irgendwie nicht)
Frage 2:
Sobald die Runde anfängt wird dem Spieler der Wert: SpielGestartet = 1; zugewiesen.
Nun habe ich einen Globalen Timer erstellt. In diesem soll Abgafragt werden ob alle Spieler tot sind, also wenn der Wert Tot =1; bei allen Spielern gesetzt ist wo SpielGestartet = 1 ist.
Das habe ich ja realisiert bekommen. Meine Frage nun, wie kann ich abfragen wie viele Spieler den werr Tot = 1 haben?
Ich möchte nämlich das wenn nur noch ein Spieler Lebt das Spiel beendet wird da ja kein anderer mehr lebt um den letzten überlebenden zu killen.
Vielen Dank im Voraus!
Frage 1: OnPlayerUpdate wird nicht mehr für den User aufgerufen, daran kannst du überprüfen ob der Spieler AFK ist oder nicht. Dafür benötigst du jedoch zusätzlich einen globalen Timer der einen Wert erhöht, welcher bei OnPlayerUpdate zurück gesetzt wird.
Frage 2: Das kannst du mit einer schleife realisieren, welche durch alle spieler durchgeht, überprüft ob die werte zutreffen und einen eine variable hochzählt wie viele Spieler noch im rennen sind.
Ich weiß nicht ob das hier richtig ist aber kann mir einer Helfen ich weill ein PM System machen so das da steht von dem man die PM bekommen hat und zu wen man die PM geschrieben hat
Ich habe lange gegoogelt und auch viel getestet es hat aber alles nicht funktioniert bzw. ich habe nichts passendes gefunden
hier mein Code:
ocmd:pm(playerid,params[])
{
new pID,text[128];
if(sscanf(params,"is[128]",pID,text))return SendClientMessage(playerid,COLOR_RED,"Info: /pm [ID] [Nachricht]");
SendClientMessage(pID,COLOR_ORANGE,text);
return 1;
}
Hoffe mir kann einer Helfen ![]()
Moin, ich bringe mir momentan das Scripten sogut es geht ohne Tutorials bei hänge aber grad bei einer sache die wahrscheinlich simpler nicht sein könnte.
dcmd_giverank(playerid,params[])
{
new pid;
new rang = sSpieler[playerid][Rang];
new spieler[256];
new leader[256];
new spielername[MAX_PLAYER_NAME];
new leadername[MAX_PLAYER_NAME];
GetPlayerName(pid,leadername,sizeof(leadername));
GetPlayerName(playerid,spielername,sizeof(spielername));
if(sscanf(params,"ud",pid,rang)) return SendClientMessage(playerid,Weiß,"Info: /giverank (playerid)(rang)");
if(pid == INVALID_PLAYER_ID) return SendClientMessage(playerid,Weiß,"Der Spieler mit dieser ID ist nicht Online!");
if(sSpieler[playerid][Leader] < 1) return SendClientMessage(playerid,Weiß,"Du bist kein Leader!");
if(pid == playerid) return SendClientMessage(playerid,Weiß,"Du kannst dir nicht selbst einen Rang geben!");
if(rang < 1 || rang > 6) return SendClientMessage(playerid,Weiß,"Der Rang muss zwischen 1 und 6 liegen!");
if(sSpieler[playerid][Leader] >= 1)
{
sSpieler[pid][Rang] = rang;
format(spieler,sizeof(spieler),"Du wurdest von %s zum Rang %d gemacht",leadername,rang);
format(leader,sizeof(leader),"Du hast %s Rang %d gegeben.",spielername,rang);
SendClientMessage(pid,Weiß,spieler);
SendClientMessage(playerid,Weiß,leader);
}
return 1;
}
Dies ist mein aktueller /giverank Befehl für alle Fraktionen.
Habe momentan 5 im Script. Funktioniert soweit alles gut.
Wie gebe ich nun aber Jeder Ziffer 1 - 6 einen Namen und das für jede Fraktion?
Alles anzeigenIch weiß nicht ob das hier richtig ist aber kann mir einer Helfen ich weill ein PM System machen so das da steht von dem man die PM bekommen hat und zu wen man die PM geschrieben hat
Ich habe lange gegoogelt und auch viel getestet es hat aber alles nicht funktioniert bzw. ich habe nichts passendes gefunden
hier mein Code:
Code: PM Systemocmd:pm(playerid,params[]) { new pID,text[128]; if(sscanf(params,"is[128]",pID,text))return SendClientMessage(playerid,COLOR_RED,"Info: /pm [ID] [Nachricht]"); SendClientMessage(pID,COLOR_ORANGE,text); return 1; }Hoffe mir kann einer Helfen
aus dem "i" ein "u" machen.
Hey du must das mit format machen.
ocmd:pm(playerid,params[])
{
new pID,text[128],string[160],name[32];
if(sscanf(params,"us[128]",pID,text))return SendClientMessage(playerid,COLOR_RED,"Info: /pm [ID] [Nachricht]");
GetPlayerName(playerid,name,sizeof(name));
format(string,sizeof(string),"[PM] %s [%i] | %s",name,playerid,text);
SendClientMessage(pID,COLOR_ORANGE,string);
return 1;
}
Alles anzeigenIch weiß nicht ob das hier richtig ist aber kann mir einer Helfen ich weill ein PM System machen so das da steht von dem man die PM bekommen hat und zu wen man die PM geschrieben hat
Ich habe lange gegoogelt und auch viel getestet es hat aber alles nicht funktioniert bzw. ich habe nichts passendes gefunden
hier mein Code:
Code: PM Systemocmd:pm(playerid,params[]) { new pID,text[128]; if(sscanf(params,"is[128]",pID,text))return SendClientMessage(playerid,COLOR_RED,"Info: /pm [ID] [Nachricht]"); SendClientMessage(pID,COLOR_ORANGE,text); return 1; }Hoffe mir kann einer Helfen
![]()
Dazu musst du mit String(Zeichenkette) arbeiten. z.B
new string[128];
format(string,sizeof(string),"PM von %s: %s",getPlayerName(playerid),text);
SendClientMessage(pID,deinefarbehier,string);
getPlayerName Funktion:
getPlayerName(playerid)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
return name;
}
Habe aktuell eine kleine Funktion geschrieben.
Diese soll einfach 2 beliebige Spieler auf dem Server tauschen, also die Positionen beider Spieler tauschen.
Kann ich das ganze noch optimieren?
Ich habe leider nur diesen Ansatz bisher hingekriegt
stock SwapPlayers()
{
if(GetPlayerCount() >= 2)
{
flag:
new randPlayer = random(GetPlayerCount());
if(GetPlayerCount() < 2)
return;
goto flag;
new Float:x1,Float:y1,Float:z1;
GetPlayerPos(randPlayer,x1,y1,z1);
flag2:
new randPlayer2 = random(GetPlayerCount());
if(!IsPlayerConnected(randPlayer2) || randPlayer2 != randPlayer)
if(GetPlayerCount() < 2)
return;
goto flag2;
new Float:x2,Float:y2,Float:z2;
GetPlayerPos(randPlayer2,x2,y2,z2);
//Teleport
if(!IsPlayerConnected(randPlayer) || !IsPlayerConnected(randPlayer2))
{
randPlayer = INVALID_PLAYER_ID;
randPlayer2 = INVALID_PLAYER_ID;
SwapPlayers();
}
SetPlayerPos(randPlayer,x2,y2,z2);
SetPlayerPos(randPlayer2,x1,y1,z1);
new pname[MAX_PLAYER_NAME+64];
GetPlayerName(randPlayer2,pname,sizeof(pname));
SendClientMessageEx(randPlayer,COLOR_WHITE,"SERVER: You have swapped your position with %s(%d)",pname,randPlayer2);
GetPlayerName(randPlayer,pname,sizeof(pname));
SendClientMessageEx(randPlayer2,COLOR_WHITE,"SERVER: You have swapped your position with %s(%d)",pname,randPlayer);
}
}
Alles anzeigen
Oder die haessliche Variante ohne goto
stock SwapPlayers()
{
if(GetPlayerCount() >= 2)
{
new randPlayer = random(GetPlayerCount());
do
{
randPlayer = random(GetPlayerCount());
if(!IsPlayerConnected(randPlayer))
if(GetPlayerCount() < 2)
return;
}
while (!IsPlayerConnected(randPlayer));
new Float:x1,Float:y1,Float:z1;
GetPlayerPos(randPlayer,x1,y1,z1);
new randPlayer2 = random(GetPlayerCount());
do
{
randPlayer2 = random(GetPlayerCount());
if(GetPlayerCount() < 2)
return;
}
while (!IsPlayerConnected(randPlayer2) && randPlayer2 != randPlayer);
new Float:x2,Float:y2,Float:z2;
GetPlayerPos(randPlayer2,x2,y2,z2);
//Teleport
if(!IsPlayerConnected(randPlayer) || !IsPlayerConnected(randPlayer2))
{
randPlayer = INVALID_PLAYER_ID;
randPlayer2 = INVALID_PLAYER_ID;
SwapPlayers();
}
SetPlayerPos(randPlayer,x2,y2,z2);
SetPlayerPos(randPlayer2,x1,y1,z1);
new pname[MAX_PLAYER_NAME+64];
GetPlayerName(randPlayer2,pname,sizeof(pname));
SendClientMessageEx(randPlayer,COLOR_WHITE,"SERVER: You have swapped your position with %s(%d)",pname,randPlayer2);
GetPlayerName(randPlayer,pname,sizeof(pname));
SendClientMessageEx(randPlayer2,COLOR_WHITE,"SERVER: You have swapped your position with %s(%d)",pname,randPlayer);
}
}
Alles anzeigen
goto ist zum 3.x jetzt oder so dreck ![]()
Schreib dir doch einfach eine Funktion die dir die IDs von 2 random Spielern wiedergibt und Kapsel das alles ein wenig.
stock getTwoRandomPlayer(&a, &b)
{
a=b=INVALID_PLAYER_ID;
new m=GetPlayerPoolSize();
if(m < 2) return;
new player[MAX_PLAYERS],idx;
for(new i=m-1; i!=-1; i--)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i)) player[idx++] = i;
}
if(idx < 2) return;
new r = random(idx),n_r;
a = player[r];
for(;;)
{
n_r = random(idx);
if(r != n_r) break;
}
b = player[n_r];
}
//Und dann kannst du das so nutzen:
new a,b;
getTwoRandomPlayer(a,b);
if(a == INVALID_PLAYER_ID || b == INVALID_PLAYER_ID)
{
//Es konnten keine 2 Spieler gefunden werden. (Weil nicht online und so...xD)
return;
}
new Float:x[2],Float:y[2],Float:z[2],name[MAX_PLAYER_NAME];
GetPlayerPos(a,x[0],y[0],z[0]);
GetPlayerPos(b,x[1],y[1],z[1]);
SetPlayerPos(b,x[0],y[0],z[0]);
SetPlayerPos(a,x[1],y[1],z[1]);
GetPlayerName(b,name,MAX_PLAYER_NAME);
SendClientMessageEx(a,COLOR_WHITE,"SERVER: You have swapped your position with %s(%d)",name,b);
GetPlayerName(a,name,MAX_PLAYER_NAME);
SendClientMessageEx(b,COLOR_WHITE,"SERVER: You have swapped your position with %s(%d)",name,a);
Alles anzeigen
Danke Kali, finde deine Posts immer wieder super ![]()
Habe eine Frage:
Kann ich eine Hexzahl so shiften, dass ich am Ende immer 00 rauskriege? Also von 0xFF00FFAA zu 0xFF00FF00 ?
Habe aktuell folgendes
stock GetPlayerNameID(playerid)
{
new name[MAX_PLAYER_NAME+24];
GetPlayerName(playerid,name,sizeof(name));
format(name,sizeof(name),"{%06x}%s (%d){FFFFFF}", GetPlayerColor(playerid) >>> 8,name,playerid);
return name;
}
Wuerde aber gerne eine Funktion machen, mit der ich die Spielerfarbe des Spielers nehmen kann, und dann setzen, jedoch mit 00 am Ende, also unsichtbar auf der Minimap
Kann ich eine Hexzahl so shiften, dass ich am Ende immer 00 rauskriege?
Joa mit einem kleinen Trick wäre das machbar:
Vielen Dank
Auch wenn ich das Shiften irgendwie nie raffe mit mehreren >>>, vorallem nicht bei Hex ![]()
Habe es jetzt so