[SAMMELTHREAD] Kleine Scripting Fragen
- Rafelder
- Unerledigt
-
-
new tmpobjid;
Das ist eine temporäre Variable, auf die du nur Zugriff hast, während der Befehl ausgeführt wird. Weder zuvor noch danach ist sie vorhanden.new gObj[2];
Das schreibst du ja unter die Includes, sprich es ist global deklariert, somit hast du jederzeit Zugriff und der Wert bleibt erhalten, daher kannst du darüber das Objekt später löschen. -
new tmpobjid;
Das ist eine temporäre Variable, auf die du nur Zugriff hast, während der Befehl ausgeführt wird. Weder zuvor noch danach ist sie vorhanden.new gObj[2];
Das schreibst du ja unter die Includes, sprich es ist global deklariert, somit hast du jederzeit Zugriff und der Wert bleibt erhalten, daher kannst du darüber das Objekt später löschen.Alles klar, danke

Nur habe ich ein kleines Problem:
CMD:deletetest(playerid,params[])
{
DestroyObject(gObj[i]);
}C:\Users\Dave\Desktop\OX-Event.pwn(264) : error 017: undefined symbol "i"
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase1 Error.
Kannst du mir auch sagen wie ich das in einem Befehl mache, möchte nicht 2 verschiedene haben...
-
CMD:deletetest(playerid,params[])
{
for(new i=0; i<sizeof(gObj); i++) DestroyObject(gObj[i]);
}Bzw, besser ist es so:
CMD:deletetest(playerid,params[])
{
for(new i=0; i<sizeof(gObj); i++)
{
if(gObj[i] != -1) DestroyObject(gObj[i]);
gObj[i] = -1;
}
}
Und bei der Deklaration:
new gObj[2] = {-1,...};Das verhindert Fehler.
-
-
CMD:edoor(playerid,params[])
{
static bool:status;
if(!status)
{
//Objekte erstellen
}
else
{
for(new i=0; i<sizeof(gObj); i++)
{
if(gObj[i] != -1) DestroyObject(gObj[i]);
gObj[i] = -1;
}
}
status = !status;
return 1;
} -
Viel besser nur habe ich 2 kleine Probleme:
1) Texturen werden nicht angezeigt, nur das Objekt selbst.
2) Beim löschen der Türen wird SendClientMessage 2 mal ausgeführt, ich weiß nicht warum.
CMD:edoor(playerid,params[])
{
static bool:status;
if(!status)
{
new tmpobjid;gObj[0] = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000);
SetObjectMaterial(tmpobjid, 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
SetObjectMaterialText(tmpobjid, "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(tmpobjid, 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
SetObjectMaterialText(tmpobjid, "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);SendClientMessage(playerid,0xFF0055FF,"Rooms locked");
}
else
{
for(new i=0; i<sizeof(gObj); i++)
{
if(gObj[i] != -1) DestroyObject(gObj[i]);
gObj[i] = -1;
SendClientMessage(playerid,0xFF0055FF,"Rooms unlocked");
}
}
status = !status;
return 1;
}Also zu dem Text, gebe ich einmal /edoor ein, erstellt sich das Objekt, Rooms locked erscheint. Lösche ich die Objekte, kommt 2 mal Rooms unlocked..
-
Du darfst beim SetObjectMaterial nicht mehr tmpobjid verwenden, sondern musst gObj[0] bzw. gObj[1] verwenden, da steht ja jetzt die Objekt ID drin.
Und die SendClientMessage darf nicht innerhalb der Schleife stehen, entweder davor oder danach. -
Ich danke dir vielmals, funktioniet bis jetzt sehr gut :).
In Planung habe ich noch einige Änderungen, die wären unter anderem:
- Ein Befehl womit ich ein Countdown starte, z.B ein Countdown der von 60 runterzählt bis auf 0.
(Im Befehl kann man eine beliebige Zahl eingeben in Sekunden.) Das soll dieser Countdown sein der auf dem Bildschirm erscheint also kein Text und ebenfalls dieser Sound der abgespielt wird. (Kenne die ID nicht).- Nachdem der Countdown abgelaufen ist, erstellen sich diese 2 Türen.
Kannst du mir da behilflich sein? Hat Zeit bis morgen weil ich jetzt nicht mehr am PC bin.
-
Das mit dem Timer ist relativ leicht.
Ich gehe einfach mal davon aus, dass man den Timer nur einmal starten kann, global gesehen, sprich wenn Spieler A ihn startet, dann kann ihn Spieler B nicht auch starten.Global unter den Includes:
new countTimer = -1;Im Befehl, dort wo der Timer gestartet werden soll:
if(countTimer != -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Countdown ist bereits an.");
if(!params[0]) return SendClientMessage(playerid, 0xFF0000FF, "Gebe eine Zeit ein.");
new time = strval(params);
if(time < 1 || time > 60) return SendClientMessage(playerid, 0xFF0000FF, "Gebe eine Zeit zwischen 1 und 60 ein.");
countTimer = SetTimerEx("CountDownObjekte", 1000, true, "dd", playerid, time);Und das Timer-Callback:
forward CountDownObjekte(playerid, count);
public CountDownObjekte(playerid, count)
{
count--;
if(count <= 0)
{
KillTimer(countTimer);
countTimer = -1;
//Hier die Objekte erstellen
}
new str[16];
format(str, sizeof(str), "Countdown: %d", count);
//TextDrawSetString? / SendClientMessage?
return 1;
} -
So jetzt habe ich wieder Zeit, danke erstmal.
Bei //TextDrawSetString? / SendClientMessage? möchte ich den Countdown als TextdrawSetString ausgeben, was sind die Parameter die dahinter gehören?
Habe bei Wiki das gefunden TextDrawSetString(himessage, newtext); .
Doch das muss ich anpassen zu meinem Code, was setze ich statt himmessage und newtext ein?
-
TextDrawSetString(himessage, newtext);
TextDrawSetString(textdrawid, str); //Die id musst du halt von deinem textdraw da einfügen...
TextDrawShowForPlayer(playerid, textdrawid); -
-
Das Textdraw das den Countdown anzeigen soll musst du natürlich unter OnGameModeInit erstellen. Das TextDrawCreate gibt dir dann die TextdrawID zurück.
-
-
Nein, sowas gibt es nicht. Das musst du, am besten mit einem Textdraweditor, selbst machen.
-
Nein, sowas gibt es nicht. Das musst du, am besten mit einem Textdraweditor, selbst machen.
Mach ich eben Fix, aber was genau muss ich erstellen? Die Zahlen 1 - 60 oder wie :o
-
Nein, du erstellst einfach nur ein einzelnes Textdraw, mit irgendeinem Text. Du setzt den Text ja in dem Timer, mit TextDrawSetString.
-
Habe mal eine kleine Frage:
Ist es empfehlenswert nach jeder Kleinigkeit in die Datenbank abzuspeichern? Oder kann dass dann zu Laggs führen?
Benutze Mysql R39-3 -
Es kann zu Laggs führen.
Empfehlenswert ist es so wenig Querys wie möglich abzusenden. -
