Du musst sie bei einem Public erstellen wo playerid gegeben ist, dafür eignet sich am besten OnPlayerConnect.
Zeigen kannst du sie wo du möchtest, ich empfehle dafür OnPlayerSpawn
Du musst sie bei einem Public erstellen wo playerid gegeben ist, dafür eignet sich am besten OnPlayerConnect.
Zeigen kannst du sie wo du möchtest, ich empfehle dafür OnPlayerSpawn
Playertextdraws sollten im OnPlayerConnect Public sein (nicht zwangsläufig) da es ja jetzt Playertextdraws sind und OngameModeInit keine playerid "Funktion" hat
PS: Du musst deine Textdraws in PlayerTextDraws umschreiben.
Finde alles ein bisschen eintönig, aber schauen trotzdem alle ganz schick aus
Wenn du Fehler in einer bestimmten Sprache findest, kannst du diese im Bereich "Translation Mistakes" in unserem Forum melden. http://forum.ulclan.com/forum/134-translation-mistakes/
Wir haben ein Tool entwickelt, was uns ermöglicht die Texte im Script zu ändern ohne den Server zu restarten - das für jede Sprache.
Beispiel:
Es gibt's noch kein genaues Datum, aber wir hatten jetzt geschätzt schon über 20 "Open Betas" in denen für einige Stunden der Server eröffnet wurde und darauf gespielt wurde damit man Bugs etc meldet und jetzt ist der Server relativ weit entwickelt. Sobald ich ein Datum habe, wird es hier angekündigt.
Ich habe keine weiteren Ideen was ich noch hinzufügen könnte, falls du welche hast, lass es mich wissen
Auf dem Gangwar Server wurde das System mit einer etwas veränderten Form hinzugefügt und schien auch gut zu klappen, doch seit etwa 2 Wochen haben sie ihr Gamemode komplett neugeschrieben und bereits online gebracht, nur weiß ich nicht ob es immernoch in Verwendung ist, da ich vorzeitig aus dem Team ausgetreten bin weil ich mich aktuell um 2 eigene Projekte kümmern muss und wenig Zeit habe um sie zu unterstützen.
Aufjedenfall wird das System in meinen Projekten verwendet
@N1co Nein, so wird das nicht funktionieren, hat sich aber sowieso erledigt, so funktionierts:
forward UpdatePaintBallInfo();
public UpdatePaintBallInfo()
{
if(paintballspieler < 1) //weniger als 1 Spieler
{
KillTimer(PaintBallEnde);
timerstarted = false;
RundeGestartet = false;
//minutes = seconds = 0;
roundTime = (15*60); // a.k.a 900sec / 15mins
}
else if(paintballspieler > 0) //mehr als 1 Spieler
{
//PaintBallEnde = SetTimer("PaintballRundeVorbei", 15 * 60 * 1000, false);
if(timerstarted == false)
{
PaintBallEnde = SetTimer("PaintballRundeVorbei", 1* 60 * 1000, false);
}
timerstarted = true;
RundeGestartet = true;
new tmp[11];
if (timerstarted)
{
roundTime --;
new
minutes = roundTime / 60,
seconds = roundTime % 60
;
format(tmp, sizeof(tmp), "%02d:%02d", minutes, seconds);
}
for(new i = GetPlayerPoolSize(); i != -1; i--)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i) || inRunde[i] == false) continue;
TextDrawSetString(PBText2,tmp);
}
}
return 1;
}
Hast du in deiner server.cfg maxnpc auch erhöht?
Meine Frage:
Wie lasse ich meinen Timer runterzählen anstatt hochzählen?
forward UpdatePaintBallInfo();
public UpdatePaintBallInfo()
{
static mi,se;
if(paintballspieler < 1) //weniger als 1 Spieler
{
KillTimer(PaintBallEnde);
timerstarted = false;
RundeGestartet = false;
mi = se = 0;
}
else if(paintballspieler > 0) //mehr als 1 Spieler
{
//PaintBallEnde = SetTimer("PaintballRundeVorbei", 15 * 60 * 1000, false);
if(timerstarted == false)
{
PaintBallEnde = SetTimer("PaintballRundeVorbei", 5* 1000, false);
}
timerstarted = true;
RundeGestartet = true;
new tmp[11];
if(++se == 60)
{
se = 0;
mi++;
}
format(tmp,sizeof(tmp),"%02d:%02d",mi,se);
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i) || inRunde[i] == false) continue;
TextDrawSetString(PBText2,tmp);
}
}
return 1;
}
Scheint gut zu funktionieren, aber der Timer zählt sich von 0:00 hoch, möchte aber das er sich runterzählt, wie stelle ich das an? (Blicke nicht so gut in deine Funktion durch)
Bei Beispielsweise 5 Minuten.
Das mache ich mit dem oben geposteten Code xD
So besser?
forward UpdatePaintBallInfo();
public UpdatePaintBallInfo()
{
for(new i=0; i<MAX_PLAYERS; i++)
{
if(paintballspieler < 1) //weniger als 1 Spieler
{
KillTimer(PaintBallEnde);
timerstarted = false;
RundeGestartet = false;
}
else if(paintballspieler > 0) //mehr als 1 Spieler
{
RundeGestartet = true;
}
}
return 1;
}
forward RoundTimer();
public RoundTimer()
{
if(RundeGestartet == true)
{
if(timerstarted == false)
{
PaintBallEnde = SetTimer("PaintballRundeVorbei", 5* 1000, false);
}
timerstarted = true;
}
}
Habe im SAMP Forum ja geschrieben das ich das vermeiden will, musste das jetzt aber machen weil ich keine andere Lösung habe, funktioniert übrigens.
Edit:
Noch ne Frage, wie zeige ich am besten die Zeit einer Runde an? Eine Runde geht beispielsweise 10 Minuten und die Textdraws sollen die Zeit anzeigen und immer runterzählen.
Habe bisher nur ein Timer der nach 10 Minuten die Runde beendet.
forward UpdatePaintBallInfo();
public UpdatePaintBallInfo()
{
for(new i=0; i<MAX_PLAYERS; i++)
{
if(paintballspieler < 1) //weniger als 1 Spieler
{
KillTimer(PaintBallEnde);
timerstarted = false;
RundeGestartet = false;
}
else if(paintballspieler > 0) //mehr als 1 Spieler
{
//PaintBallEnde = SetTimer("PaintballRundeVorbei", 15 * 60 * 1000, false);
if(timerstarted == false)
{
PaintBallEnde = SetTimer("PaintballRundeVorbei", 5* 1000, false);
}
timerstarted = true;
RundeGestartet = true;
}
}
return 1;
}
Mein Zeit Textdraw
PBText2 = TextDrawCreate(299.000000, 428.000000, "00:00");
TextDrawBackgroundColor(PBText2, 255);
TextDrawFont(PBText2, 2);
TextDrawLetterSize(PBText2, 0.380000, 2.100000);
TextDrawColor(PBText2, -1);
TextDrawSetOutline(PBText2, 1);
TextDrawSetProportional(PBText2, 1);
TextDrawSetSelectable(PBText2, 0);
Ne aber mein Gamemode benutzt eine Include in der OnPlayerDeath gehooked wird.
Habe da jetzt auch ein Post verfasst. http://forum.sa-mp.com/showthread.php?p=3769419#post3769419
Wieso wird mein OnPlayerDeath Callback nicht aufgerufen? (Filterscript)
public OnPlayerDeath(playerid, killerid, reason)
{
print("OPD aufgerufen");
new str[64];
if(inRunde[playerid] == true)
{
tode[playerid]++;
format(str, sizeof(str),"Tode: ~g~%d",tode[playerid]);
PlayerTextDrawSetString(playerid, KDText[playerid][1], str);
}
return 1;
}
Yo, wie ändere ich die Zahl in die Anzahl der Spieler die sich in der Arena befinden?
Habe hier ein Objekt mit folgendem Text:
tmpobjid = CreateDynamicObject(19483, 1305.009155, -1367.589599, 13.762177, -0.000007, -0.000000, -89.999977, -1, -1, -1, 50.00, 50.00);
SetDynamicObjectMaterialText(tmpobjid, 0, "< Spieler >\n {FF0000}13", 90, "Ariel", 20, 1, 0xFF000000, 0x00000000, 1);
So sieht meine Spieler Variable aus:
new paintballspieler = 0;
Wie ändere ich das jetzt um, dass wenn 5 Spieler drin sind, die Zahl auf 5 gesetzt wird?
Das sind doch random Zahlen und Buchstaben die ich eingebe, der befindet sich nirgendswo im Script : )
Habe doch erwähnt das es sich um ein Befehl handelt der gar nicht existiert
Habe ich voll verpeilt
Habe noch ein kleines Problem, wenn ich lange Befehle eingebe (die gar nicht existieren) werden mir immer Errors in der Server Log ausgegeben.
Kann ich das irgendwie verhindern?
[debug] Run time error 4: "Array index out of bounds"
[debug] Accessing element at index 32 past array upper bound 31
[debug] AMX backtrace:
[debug] #0 0003153c in public OnPlayerCommandText (playerid=0, cmdtext[]=@00c91104 "/4578tz5r4785r474t7t4747334837u45893z45378z53785z347853") at C:\Users\David\Desktop\LnD\pawno\include\zcmd.inc:94
Ist nicht der Fall, nein.
Habe jetzt den Code von OnPlayerConnect zu OnPlayerSpawn verschoben, da funktioniert das komischerweise
Eigentlich nicht, hier ein Teil von meinem LoadAccount Public
public LoadAccount(id)
{
new Query[1024];
format(Query, sizeof(Query), "SELECT * FROM `players` WHERE Name = '%s'", GetName(id));
mysql_query(MySQL, Query);
//Pegar string: cache_get_field_content(0, "String", result);
pData[id][P_IP] = cache_get_field_content_int(0, "PIP");
pData[id][P_Admin] = cache_get_field_content_int(0, "Admin");
pData[id][P_Level] = cache_get_field_content_int(0, "Level");
pData[id][P_Kills] = cache_get_field_content_int(0, "Kills");
pData[id][P_Deaths] = cache_get_field_content_int(0, "Deaths");
pData[id][P_Ratio] = cache_get_field_content_int(0, "Ratio");
pData[id][P_Weed] = cache_get_field_content_int(0, "Weed");
pData[id][P_Exp] = cache_get_field_content_int(0, "Exp");
pData[id][P_MExp] = cache_get_field_content_int(0, "MExp");
pData[id][P_Banned] = cache_get_field_content_int(0, "Banned");
pData[id][P_Skin] = cache_get_field_content_int(0, "Skin");
pData[id][P_Color] = cache_get_field_content_int(0, "Color");
pData[id][P_Weather] = cache_get_field_content_int(0, "Weather");
pData[id][P_Time] = cache_get_field_content_int(0, "Time");
pData[id][P_AutoLogin] = cache_get_field_content_int(0, "AL");
pData[id][P_RandomServerMSG] = cache_get_field_content_int(0, "RSVMSG");
pData[id][P_ReceivedBonus] = cache_get_field_content_int(0, "ReceivedBonus");
SetPlayerScore(id, pData[id][P_Level]);
SetPlayerColor(id, pData[id][P_Color]);
SetPlayerWeather(id, pData[id][P_Weather]);
SetPlayerTime(id, pData[id][P_Time], 0);
Hi, ich speichere die Wetter & die Time ID vom Spieler und setze die bei jedem Login zum alten Wert zurück, aber es scheint nicht zu funktionieren.
In der Datenbank werden die Werte problemslos eingetragen & gespeichert, aber die Werte werden Ingame nicht gesetzt bzw. sind nach dem Login wieder standard.
Hier mein Wetter Befehl:
CMD:weather(playerid, params[]) {
new w[128], wID = strval(params);
if(isnull(params))
return SendClientMessage(playerid, COLOR_RED, "Use: /weather <id>.");
if(!IsNumeric(params))
return SendClientMessage(playerid, COLOR_RED, "You need to put a number for weather id.");
if(wID < 0 || wID > 500)
return SendClientMessage(playerid, COLOR_RED, "Invalid Weather.");
SetPlayerWeather(playerid, wID);
pData[playerid][P_Weather] = wID;
format(w, sizeof(w), "Weather changed to %d", wID);
SendClientMessage(playerid, COLOR_ORANGE, w);
format(w, sizeof(w), "UPDATE `players` SET Weather = %d WHERE Name = '%s'", wID, GetName(playerid));
mysql_query(MySQL, w);
mysql_store_result();
return 1;
}
So lade ich das (bei OnPlayerConnect testweise hinzugefügt, hilft nicht)
OnPlayerConnect:
SetPlayerWeather(playerid, pData[playerid][P_Weather]);
SetPlayerTime(playerid, pData[playerid][P_Time], 0);