N'Abend Community,
seit etwa vier bis fünf Tagen beschäftige ich mich erstmalig mit PAWN - mehr oder minder des Interesses wegen, ich habe nicht vor ein großes Projekt zu starten.
Im Grunde will ich nichts weiter, als einen Übungsserver aufzubauen (um z.B. die Skills fuer DM-Aktionen aufzuwerten)... und habe mich an und für sich auch schon gut eingearbeitet. Registersystem steht, Adminsystem steht, DM-System steht halb, Auto/Tuning/Teleport-Funktionen in Form von Dialoge stehen, gemappte Objekte (~80) und aufgehende Türen stehen, InfoAnzeige innerhalb eines Deathmatch stehen halb.
Allerdings habe ich nun einen Punkt erreicht, in dem ich das Problem nicht sehe, nicht erkenne und daher eure Hilfe benötige um weiter zu kommen.
Weil ich derjenige bin, der Hilfe erwartet, will ich mein Problem und mein Ziel, das ich letzten Endes erreichen möchte, darlegen:
Geplant sind unterschiedliche "Deathmatch"-Systeme, die sich in jeweils eigenen und extra ausgewählten Interiors abspielen - das soll hier jedoch keine Rolle spielen, gehen wir von EINEM Deathmatch-Modus aus.
Der Spieler begibt sich (aktuell noch über einen Befehl) in den DM-Modus, in dem es zwei Teams gibt - es wird per (pseudo)Zufall entschieden, in welches Team er kommt sofern die Teams eine gleiche Spieleranzahl beherbergen, ansonsten steigt er automatisch im kleineren Team ein. Jedes Team hat automatisch seinen eigenen Skin sowie seine eigene Farbe (SetPlayerColor), nach jedem Tod (bzw. Spawn) werden die Waffen resettet und neu gegeben, bis dahin gibt es keine Probleme.
Im DM-Interior gibt es zwei Spawnpunkte, einen für jedes Team und befindet sich auch beidemale hinter verschlossenen Türen. Auch das ist kein Problem.
Etwas kniffelig wird es ab jetzt; Wenn der zweite Spieler spawnt, sein Team nur ihn besitzt und das gegnerische Team ebenfalls nur einen Spieler aufzuweisen hat, soll ein Countdown beginnen, nach diesem die Tore kurz geöffnet werden. Ebenfalls soll der Countdown beginnen und die Tore geöffnet werden, wenn unabhängig von der Teamgröße nur noch einer in beiden Teams am Leben ist.
Bis auf ein paar seltsame Fehler hat das auch alles bereits funktioniert, aber eben mit kleinen Fehlern, die definitiv unter OnPlayerDeath zu finden sind. Da dieser Abschnitt bei mir das reinste Durcheinander war, auch viel zu (unnötig) groß, wollte ich mich daran machen, diesen Teil komplett neu zu schreiben, logisch nachvollziehend und skizzenhaft mit Stift und Papier bereits fertig gestellt.
Vermutlich mag der eine oder andere jetzt denken, ja spinnt denn der, einen solchen Aufsatz zu schreiben mit seinen Zielen wenn es doch auch viel kürzer ginge - allerdings vermute ich, hier und da nochmal darauf zurück zu kommen, falls sich andere Problemchen die ich zu lösen hoffe nicht lösen lassen.
Mein OnPlayerDeath sieht aktuell wie folgt aus:
public OnPlayerDeath(playerid, killerid, reason)
{
if(GetPlayerTeam(playerid) == 1 || GetPlayerTeam(playerid) == 2)
{
if(Gruppe1 == 0 || Gruppe2 == 0)
{
SendClientMessage(playerid,GELB,"Warte auf Gegner...");
return 1;
}
if(Gruppe1 >= 1 && Gruppe2 >= 1)
{
if(Gruppe1 == Gruppe1Tod || Gruppe2 == Gruppe2Tod)
{
if(IstSpielerInTeam(killerid,1))
{
SetPlayerPos(killerid,961.2678,2100.2549,1011.0256);
SetPlayerFacingAngle(killerid,7.5695);
SetPlayerHealth(killerid,100.0);
ResetPlayerWeapons(killerid);
GivePlayerWeapon(killerid, 24, 250);
GivePlayerWeapon(killerid, 31, 500);
}
if(IstSpielerInTeam(killerid,2))
{
SetPlayerPos(killerid,959.1449,2167.9775,1011.0234);
SetPlayerFacingAngle(killerid,358.7257);
SetPlayerHealth(killerid,100.0);
ResetPlayerWeapons(killerid);
GivePlayerWeapon(killerid, 24, 250);
GivePlayerWeapon(killerid, 31, 500);
}
Gruppe1Tod = 0;
Gruppe2Tod = 0;
for(new i=0;i<MAX_PLAYERS;i++)
{
if(sSpieler[i][Team] == 1 || sSpieler[i][Team] == 2)
{
SendClientMessage(i,GELB,"Neue Runde wird gestartet in...");
}
}
timecount = 7; // anpassen.
timestop = SetTimer("Timer1",1000,true);
return 1;
}
}
}
return 1;
}
Das Problem muss - warum, sehe ich nicht, hier liegen:
if(Gruppe1 >= 1 && Gruppe2 >= 1)
{
if(Gruppe1 == Gruppe1Tod Gruppe2 == Gruppe2Tod)
Was ist an der zweiten if-Abfrage falsch?
Ohne diese zweite Abfrage (wenn also bei beiden Teams mind. 1 Mitspieler vorhanden ist) läuft das durch, der Timer wird gestartet und somit die Tore geöffnet.
Vorweg: Ich habe bereits einen Testbefehl eingebaut, welcher den Variablen Gruppe1, Gruppe1Tod, Gruppe2 und Gruppe2Tod den Wert 1 zuschreibt, um dort Unstimmigkeiten ausschließen zu können. Es liegt also nicht daran, dass die zweite if-Abfrage nicht erfüllt ist...
Und der Vollständigkeit halber; mein altes OnPlayerDeath sah so aus:
public OnPlayerDeath(playerid, killerid, reason)
{
if(GetPlayerTeam(killerid) != GetPlayerTeam(playerid))
{
SetPlayerScore(killerid, GetPlayerScore(killerid) + 1);
new string[128];
format(string, sizeof(string), "Kills: %d", GetPlayerScore(killerid));
SendClientMessage(killerid,BLAU,string);
if(IstSpielerInTeam(playerid,1))
{
if(IstSpielerInTeam(killerid,1) || IstSpielerInTeam(killerid,2))
{
Gruppe2Kills ++;
new tod = GetPVarInt(playerid,"Tode");
SetPVarInt(playerid,"Tode", tod + 1);
for(new i=0;i<MAX_PLAYERS;i++)
{
if(sSpieler[i][Team] == 1 || sSpieler[i][Team] == 2)
{
new kname[MAX_PLAYER_NAME], oname[MAX_PLAYER_NAME], string2[128];
GetPlayerName(killerid,kname,sizeof(kname));
GetPlayerName(playerid,oname,sizeof(oname));
format(string2, sizeof(string2), "{FFE600}%s {DCDCDC}tötete {0073FF}%s", kname, oname);
SendClientMessage(i,GRAU,string2);
}
}
}
}
if(IstSpielerInTeam(playerid,2))
{
if(IstSpielerInTeam(killerid,1) || IstSpielerInTeam(killerid,2))
{
Gruppe1Kills ++;
new tod = GetPVarInt(playerid,"Tode");
SetPVarInt(playerid,"Tode", tod + 1);
for(new i=0;i<MAX_PLAYERS;i++)
{
if(sSpieler[i][Team] == 1 || sSpieler[i][Team] == 2)
{
new kname[MAX_PLAYER_NAME], oname[MAX_PLAYER_NAME], string2[128];
GetPlayerName(killerid,kname,sizeof(kname));
GetPlayerName(playerid,oname,sizeof(oname));
format(string2, sizeof(string2), "{0073FF}%s {DCDCDC}tötete {FFE600}%s", kname, oname);
SendClientMessage(i,GRAU,string2);
}
}
}
}
}
if(IstSpielerInTeam(playerid,1))
{
Gruppe1Tod++;
if(Gruppe2 == 1)
{
Gruppe1Tod = 0;
Gruppe2Tod = 0;
Gruppe1Kills = 0;
Gruppe2Kills = 0;
SetPlayerPos(killerid,959.1449,2167.9775,1011.0234);
SetPlayerFacingAngle(killerid,358.7257);
SetPlayerHealth(killerid,100.0);
ResetPlayerWeapons(killerid);
GivePlayerWeapon(killerid, 24, 250);
GivePlayerWeapon(killerid, 31, 500);
for(new i=0;i<MAX_PLAYERS;i++)
{
if(sSpieler[i][Team] == 1 || sSpieler[i][Team] == 2)
{
SendClientMessage(i,GELB,"Neue Runde wird gestartet in...");
}
}
timecount = 7; // anpassen.
timestop = SetTimer("Timer1",1000,true);
return 1;
}
if(Gruppe2 == 0)
{
SendClientMessage(playerid,GELB,"Warte auf Gegner...");
return 1;
}
}
if(IstSpielerInTeam(playerid,2))
{
Gruppe2Tod++;
if(Gruppe1 == 1)
{
Gruppe1Tod = 0;
Gruppe2Tod = 0;
Gruppe1Kills = 0;
Gruppe2Kills = 0;
SetPlayerPos(killerid,961.2678,2100.2549,1011.0256);
SetPlayerFacingAngle(killerid,7.5695);
SetPlayerHealth(killerid,100.0);
ResetPlayerWeapons(killerid);
GivePlayerWeapon(killerid, 24, 250);
GivePlayerWeapon(killerid, 31, 500);
for(new i=0;i<MAX_PLAYERS;i++)
{
if(sSpieler[i][Team] == 1 || sSpieler[i][Team] == 2)
{
SendClientMessage(i,GELB,"Neue Runde wird gestartet in...");
}
}
timecount = 7; // anpassen.
timestop = SetTimer("Timer1",1000,true);
return 1;
}
if(Gruppe1 == 0)
{
SendClientMessage(playerid,GELB,"Warte auf Gegner...");
return 1;
}
}
if(Gruppe1 == Gruppe1Tod || Gruppe2 == Gruppe2Tod)
{
if(IstSpielerInTeam(killerid,1))
{
SetPlayerPos(killerid,961.2678,2100.2549,1011.0256);
SetPlayerFacingAngle(killerid,7.5695);
SetPlayerHealth(killerid,100.0);
ResetPlayerWeapons(killerid);
GivePlayerWeapon(killerid, 24, 250);
GivePlayerWeapon(killerid, 31, 500);
}
if(IstSpielerInTeam(killerid,2))
{
SetPlayerPos(killerid,959.1449,2167.9775,1011.0234);
SetPlayerFacingAngle(killerid,358.7257);
SetPlayerHealth(killerid,100.0);
ResetPlayerWeapons(killerid);
GivePlayerWeapon(killerid, 24, 250);
GivePlayerWeapon(killerid, 31, 500);
}
Gruppe1Tod = 0;
Gruppe2Tod = 0;
for(new i=0;i<MAX_PLAYERS;i++)
{
if(sSpieler[i][Team] == 1 || sSpieler[i][Team] == 2)
{
SendClientMessage(i,GELB,"Neue Runde wird gestartet in...");
}
}
timecount = 7; // anpassen.
timestop = SetTimer("Timer1",1000,true);
}
return 1;
}
Hoffe, mir kann geholfen werden.
Grüße