Sollte mit einer einfachen if-Abfrage und der Funktion http://wiki.sa-mp.com/wiki/MoveObject problemlos möglich sein.
Mehr brauchst du dafür nicht.
Sollte mit einer einfachen if-Abfrage und der Funktion http://wiki.sa-mp.com/wiki/MoveObject problemlos möglich sein.
Mehr brauchst du dafür nicht.
Die Variable "reason" ist nicht als String deklariert. Da du aber eine Zeichenkette erstellen möchtest, musst du die Variable "reason" auch als String deklarieren.
new reason[64]
Und warum ist im String keine Formatierung für die Variable "reason" vorhanden?
format(string,sizeof(string),"AdmCmd: %s wurde vom Administrator %s zum Administrator/Supporter ernannt. Grund: %s",SpielerName(pID),SpielerName(playerid),reason);
Damit müsste es gehen.
Deine 2. Frage kannst du genauso lösen. Du formatierst einfach einen zweiten String und sendest diesen dann an die playerid bzw. an die pID.
Um die Größe der zweiten Dimension zu bekommen, so:
for(new i = 0; i < sizeof TeamVehicles[]; i++)
Dann habe ich aber die Größe des enums, ich würde gerne die Größe einer Variable im enum selbst haben. (Damit ich alle Fahrzeuge eines Teams respawnen kann)
In diesem Fall also die Größe von "TeamVehicles[lcn][]". LCN ist das Team und die Dimension danach die Fahrzeuge. (TeamVehicles[lcn][0] = AddStaticVehicle...)
Kann mir jemand sagen wie ich die Größe eines 2D Arrays ermitteln kann? Ich tu mich mit sizeof etwas schwer...
if(team == 1)
{
for(new i = 0; i <= TeamVehicles[lcn][10]; i++)
{
SetVehicleToRespawn(i);
}
}
Zurzeit habe ich es so gelöst. Falls jetzt aber Fahrzeuge dazukommen, muss ich die Funktion immer wieder ändern.
http://wiki.sa-mp.com/wiki/TextDrawDestroy in den Public setzen, der vom Timer aufgerufen wird.
public WerbungsTimer()
{
werbungavailable = 0;
TextDrawDestroy(Werbung);
return 1;
}
Alles anzeigenif(mutetime[playerid] >= 1)
{
SendClientMessage(playerid,ROT,"Du bist gemuted.");
}
C:\Users\Tolik\Desktop\Selfmade.pwn(1305) : error 028: invalid subscript (not an array or too many subscripts): "mutetime"
C:\Users\Tolik\Desktop\Selfmade.pwn(1305) : warning 215: expression has no effect
C:\Users\Tolik\Desktop\Selfmade.pwn(1305) : error 001: expected token: ";", but found "]"
C:\Users\Tolik\Desktop\Selfmade.pwn(1305) : error 029: invalid expression, assumed zero
C:\Users\Tolik\Desktop\Selfmade.pwn(1305) : fatal error 107: too many error messages on one line
Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
4 Errors.
Und was soll ich damit jetzt anfangen? Fehlerzeilen markieren und bitte den Code richtig einfügen...
new mutetime[MAX_PLAYERS];
forward mutetimer(playerid);
ocmd:mute(playerid,params[])
{
new pID,Zeit,string[128];
if(!IstSpielerAdmin(playerid,1)) return SendClientMessage(playerid,ROT,"Du bist kein Probe-Supporter!");
if(sscanf(params,"ui",pID,Zeit)) return SendClientMessage(playerid,weis,"/mute [ID] [ZEIT]");
{
format(string,sizeof(string),"Du wurdest für %d Minuten gemuted",zeit);
SendClientMessage(pID,-farbe-,string);
mutetimeplayerid] = zeit;
SetTimerEx("mutetimer",zeit*60000,false,"i",pID);
}
return 1;
}
public OnPlayerText(playerid, text[])
{
if(mutetimeplayerid] >= 1)
{
SendClientMessage(playerid,-farbe-,"Du bist gemuted.");
return 0;
}
}
public mutetimer(playerid)
{
mutetime[playerid] = 0;
}
Kann sein dass der ein oder andere Fehler sich eingeschlichen hat, solltest du aber ohne Probleme beheben können.
SetTimerEx("StatsDraw[i]", 3000, false, "i", playerid);
Das ist mein Timer ist der Korrekt ?
So sollte es passen. (wenn der Public nach "StatsDraw" benannt ist)
SetTimerEx("StatsDraw", 3000, false, "i", playerid);
Du kannst und musst sogar die Funktionsvariablen rausnehmen, sonst gibt's nen Fehler. Er findet sonst den Public nicht.
dcmd_ad(playerid,params[])
{
new textt[100], name[MAX_PLAYER_NAME];
if(sscanf(params,"s",textt))return SendClientMessage(playerid,HellBlau,"/ad [Text]");
GetPlayerName(playerid,name,sizeof(name));
if(werbungavailable == 0)
{
TextDrawSetString(Werbung, textt);
TextDrawShowForAll(Werbung);
SetTimer("WerbungsTimer",50000,false);
werbungavailable = 1;
}
else if(werbungavailable == 1)
{
SendClientMessage(playerid,Rot,"Es hat bereits jemand eine Werbung geschaltet. Warte bis zu 1 Minuten und probiere es erneut.");
}
return 1;
}
Hatte dir ja gesagt dass du die TextDrawSetString Funktion noch nutzen sollst, hab das mal in DialogHD's Source mit eingebaut.
Warum PlayerTextDraw? Du machst die Werbung doch sowieso global für jeden sichtbar, da kannst du ja dann auch folgendes nutzen:
Werbung = TextDrawCreate(525.000000, 125.000000," ");
Die Warning kommt übrigens durch die Definierung des TextDraws oben im Script, wenn du die PlayerTextDraw Funktion nutzen möchtest, muss die Variable immer ein "PlayerText:" als Prefix haben.
Lass es aber jetzt so wie es ist und nehme den berichtigten Code von mir.
€: Du musst die TextDrawSetString Funktion noch zusätzlich nutzen.
Hä? Ich dachte du wolltest das genau so? Wie möchtest du das sonst angezeigt haben?
Der Fehler liegt garantiert nicht am Befehl, hab den eben mal auf meinem Testserver getestet. Ergebnis siehst du im Screenshot.
Das hat dann aber nichts mit meiner Lösung für dein eigentliches Problem zutun.
Hast du deinen Befehl so auch definiert?
public OnPlayerCommandText(playerid, cmdtext[])
{
dcmd(ad,2,cmdtext);
return 0;
}
Ansonsten kann ich dir bei dcmd nicht viel helfen, arbeite eigentlich nur mit ocmd. Konnte aber auf den ersten Blick keinen Fehler im eigentlichen Befehl feststellen.
Was genau geht nicht? Genaue Problembeschreibung wäre hilfreich.
Solltest du machen, ja.
Brauchst du aber nicht komplett entfernen, auskommentieren reicht auch.
Naja, ich weiß nicht wirklich was du mit den beiden Timern anstellen möchtest. Wenn du abfragen möchtest, ob die Werbungsanzeige wieder gefüllt werden kann, machst du das einfach mit einer Variable. Du brauchst dafür nicht die Timerzeit abfragen. Würde sogar weniger Ressourcen in Anspruch nehmen.
Hab mir mal erlaubt deinen Code etwas abzuändern:
oben im Script:
new werbungavailable;
forward WerbungsTimer();
Befehl:
dcmd_ad(playerid,params[])
{
new string[256], textt[100], name[MAX_PLAYER_NAME];
if(sscanf(params,"s[100]",textt))return SendClientMessage(playerid,HellBlau,"/ad [Text]");
GetPlayerName(playerid,name,sizeof(name));
if(werbungavailable == 0) //Zeile 3011
{
format(string,sizeof(string),"Werbung: %s, von %s",textt,name);
TextDrawSetString(Werbung,string);
TextDrawShowForAll(Werbung);
SetTimer("WerbungsTimer",300000,false);
werbungavailable = 1;
}
else if(werbungavailable == 1)
{
SendClientMessage(playerid,Rot,"Es hat bereits jemand eine Werbung geschaltet. Warte bis zu 5 Minuten und probiere es erneut.");
}
return 1;
}
public WerbungsTimer()
{
werbungavailable = 0;
return 1;
}
Immer noch nicht
Ich benutze ab und an
Function
Und ab und an
Public
Kann es daran liegen?
Kommentier doch mal die komplette Funktion (OnPlayerDeath) bei dir aus und lass mal den normalen OnPlayerDeath Callback das abarbeiten.
Du benutzt anscheinend für den Timer der Werbung und die Abfrage (ob die Werbung verfügbar ist) die selbe Variable.
Hier müsste der Fehler sein:
SetTimer("WerbungsTimer",30000,1);
anpassen zu:
SetTimer("werbung2",30000,1);
und dementsprechend auch den Public ändern.
Denke nicht das es funktioniert, da du "Haus" mit der Variable "cmdtext" vergleichst. Da müsste der Dialog dann erst kommen, wenn man nur "haus" in den Chat eingibt.
Probier's aber einfach mal aus.
Ich hätte das allerdings mit ocmd/dcmd/zcmd gemacht, vielleicht hilft es dir ja:
ocmd:hilfe(playerid,params[])
{
new input[16];
if(sscanf(params,"s",input)) return SendClientMessage(playerid,weiß,"Benutzung: /hilfe <suchbegriff>");
{
if(!strcmp(input,"haus",false)) return ShowPlayerDialog....
else if (!strcmp(input,"auto",false)) return ShowPlayerDialog....
}
return 1;
}
Alles anzeigen
Musst auch statt
new Text:textdrawname[MAX_PLAYERS];
new PlayerText:textdrawname[MAX_PLAYERS];
Und halt alle Textdraws auch mit dem neuem Tag versehen.
Mfg,
UncleSub
Hab ich mittlerweile auch gemerkt und dementsprechend angepasst. Nun funktioniert das auch, hatte nur überall das "Player" vor dem "Text" vergessen. Danke dir trotzdem.