Da hast du Recht, ich mag lieber auch sscanf.
Ich teste nur gerade mal den Urgodfather, und da ist das drinnen, habe nicht soviel Lust das ueberall zu wechseln
Beiträge von Sub Royal
-
-
Danke dir das war das Problem.
Nun klappt es wieder! -
Das ist die alte, gibt aber irgendwie eine bessere von jemanden hier aus dem Forum.
-
Hat jemand gerade die verbesserte strtok Funktion parat? Finde die gerade nicht im Web.
-
Ich gruesse euch liebe Community.
Ich habe aktuell eine RX580 und Spiele GTA V, jedoch habe ich das Problem dass weisse Waende in GTA V schwarz sind, und auch sonst Texturfehler auftreten.
Kennt jemand das Problem, bzw. gibt es einen Workaround? -
//EDIT: Hat sich erledigt, habe eine effiziente Loesung gefunden
Ich nutze nun fuer jede Teamvariable, egal ob Bett, Farbe etc. ein eigenes Array, damit geht das deutlich simpler.
Die Array Variante klappt prima.So, habe folgende Frage.
Habe aktuell ein Kommando mit welchem ich ein Bett eines gegnerischen Teams vernichten kann, d.h. dass die BettID != gPlayerTeamSelection[playerid] ist.
Dabei checke ich, dass das Bett nicht das Bett des eigenen Teams ist, und das Bett nicht bereits zuvor vernichtet wurde.Dabei habe ich aktuell diesen fetten klumpen, und den wuerde ich gerne reduzieren.
C
Alles anzeigenif(strcmp(cmdtext, "/blowup", true) == 0 && GameHasStarted == 1) { for(new i = 0; i < sizeof(beds); i++) { new Float:health; GetPlayerHealth(playerid,health); if(running !=1 && IsPlayerInRangeOfPoint(playerid,3.0,beds[i][0],beds[i][1],beds[i][2]) && health > 0 && !IsPlayerInAnyVehicle(playerid)) // In this script we deal with players only { if((i == 0 && gPlayerTeamSelection[playerid] == FIRST_TEAM) || (i == 1 && gPlayerTeamSelection[playerid] == SECOND_TEAM) || (i == 2 && gPlayerTeamSelection[playerid] == THIRD_TEAM) || (i == 3 && gPlayerTeamSelection[playerid] == FOURTH_TEAM) || (i == 4 && gPlayerTeamSelection[playerid] == FIFTH_TEAM) || (i == 5 && gPlayerTeamSelection[playerid] == SIXTH_TEAM)) return SendClientMessage(playerid, COLOR_WHITE, "SERVER: You cannot blow up the bed of your own team!"); running = 1; PlayerInfo[playerid][pBeds]=GetPlayerScore(playerid); SetTimer("BlowUpThisBed", bombtimer, false); if(i == 0 && BED_STATE_TEAM_ONE !=-1 && BED_STATE_TEAM_ONE !=-2 ) { BED_STATE_TEAM_ONE=-1; SendClientMessage(playerid, COLOR_WHITE, "SERVER: You are blowing up the bed of Team "#FIRST_TEAM_COLOR_TAG); } if(i == 1 && BED_STATE_TEAM_TWO !=-1 && BED_STATE_TEAM_TWO !=-2 ) { BED_STATE_TEAM_TWO=-1; SendClientMessage(playerid, COLOR_WHITE, "SERVER: You are blowing up the bed of Team "#SECOND_TEAM_COLOR_TAG); } #if defined TEAMSIZE #if TEAMSIZE >=3 if(i == 2 && BED_STATE_TEAM_THREE !=-1 && BED_STATE_TEAM_THREE !=-2 ) { BED_STATE_TEAM_THREE=-1; SendClientMessage(playerid, COLOR_WHITE, "SERVER: You are blowing up the bed of Team "#THIRD_TEAM_COLOR_TAG); } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >=4 if(i == 3 && BED_STATE_TEAM_FOUR !=-1 && BED_STATE_TEAM_FOUR !=-2 ) { BED_STATE_TEAM_FOUR=-1; SendClientMessage(playerid, COLOR_WHITE, "SERVER: You are blowing up the bed of Team "#FOURTH_TEAM_COLOR_TAG); } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >=5 if(i == 4 && BED_STATE_TEAM_FIVE !=-1 && BED_STATE_TEAM_FIVE !=-2 ) { BED_STATE_TEAM_FIVE=-1; SendClientMessage(playerid, COLOR_WHITE, "SERVER: You are blowing up the bed of Team "#FIFTH_TEAM_COLOR_TAG); } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >=6 if(i == 5 && BED_STATE_TEAM_SIX !=-1 && BED_STATE_TEAM_SIX !=-2 ) { BED_STATE_TEAM_SIX=-1; SendClientMessage(playerid, COLOR_WHITE, "SERVER: You are blowing up the bed of Team "#SIXTH_TEAM_COLOR_TAG); } #endif #endif PlayerInfo[playerid][pBeds]+=1; SendClientMessage(playerid, COLOR_WHITE, "SERVER: Planted Bomb Successfully. Lets Blow This Bed Up!"); SetPlayerScore(playerid, GetPlayerScore(playerid) + 1); SendClientMessage(playerid, COLOR_WHITE, "SERVER: Keep Running! Bed Will Blow Up In 5 seconds!"); GetPlayerPos(playerid, x1, y1, z1); ApplyAnimation(playerid, "BOMBER", "BOM_Plant_Loop", 4.0, 1, 0, 0, 1, 1); for(new k = 0; k < MAX_PLAYERS; k++) { PlayerPlaySound(k,7416,x1,y1,z1); } CountDownTimer = SetTimer("CountDown", 1000, true); new Float:dist = GetDistance(beds[i][0],beds[i][1],beds[i][2],x1,y1,z1); printf("Distance to closest bed: %f, Index: %d", dist, i); return 1; } } return 0; } return 1; }
C
Alles anzeigenpublic BlowUpThisBed() { CreateExplosion(x1, y1, z1, 7, 10.0);//'heavy' explosion close to bed CreateExplosion(x1, y1, z1, 9, 10.0); running=0; printf("Blow Up This Bed called"); if(BED_STATE_TEAM_ONE == -1) { BED_STATE_TEAM_ONE = -2; SendTeamMessage(FIRST_TEAM,COLOR_WHITE,"SERVER: Sudden death! Keep running, your bed has been blown up! There is no respawn after death!"); new adstring[64]; format(adstring,sizeof(adstring),"SERVER: The bed of team %s {FFFFFF}blew up!",FIRST_TEAM_COLOR_TAG); SendClientMessageToAll(-1,adstring); GangZoneHideForAll(TEAM_ZONE_ONE); } if(BED_STATE_TEAM_TWO == -1) { BED_STATE_TEAM_TWO = -2; SendTeamMessage(SECOND_TEAM,COLOR_WHITE,"SERVER: Sudden death! Keep running, your bed has been blown up! There is no respawn after death!"); new adstring[64]; format(adstring,sizeof(adstring),"SERVER: The bed of team %s {FFFFFF}blew up!",SECOND_TEAM_COLOR_TAG); SendClientMessageToAll(-1,adstring); GangZoneHideForAll(TEAM_ZONE_TWO); } #if defined TEAMSIZE #if TEAMSIZE >= 3 if(BED_STATE_TEAM_THREE == -1) { BED_STATE_TEAM_THREE = -2; SendTeamMessage(THIRD_TEAM,COLOR_WHITE,"SERVER: Sudden death! Keep running, your bed has been blown up! There is no respawn after death!"); new adstring[64]; format(adstring,sizeof(adstring),"SERVER: The bed of team %s {FFFFFF}blew up!",THIRD_TEAM_COLOR_TAG); SendClientMessageToAll(-1,adstring); GangZoneHideForAll(TEAM_ZONE_THREE); } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >= 4 if(BED_STATE_TEAM_FOUR == -1) { BED_STATE_TEAM_FOUR = -2; SendTeamMessage(FOURTH_TEAM,COLOR_WHITE,"SERVER: Sudden death! Keep running, your bed has been blown up! There is no respawn after death!"); new adstring[64]; format(adstring,sizeof(adstring),"SERVER: The bed of team %s {FFFFFF}blew up!",FOURTH_TEAM_COLOR_TAG); SendClientMessageToAll(-1,adstring); GangZoneHideForAll(TEAM_ZONE_FOUR); } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >= 5 if(BED_STATE_TEAM_FIVE == -1) { BED_STATE_TEAM_FIVE = -2; SendTeamMessage(FIFTH_TEAM,COLOR_WHITE,"SERVER: Sudden death! Keep running, your bed has been blown up! There is no respawn after death!"); new adstring[64]; format(adstring,sizeof(adstring),"SERVER: The bed of team %s {FFFFFF}blew up!",FIFTH_TEAM_COLOR_TAG); SendClientMessageToAll(-1,adstring); GangZoneHideForAll(TEAM_ZONE_FIVE); } #endif #endif #if defined TEAMSIZE #if TEAMSIZE == 6 if(BED_STATE_TEAM_SIX == -1) { BED_STATE_TEAM_SIX = -2; SendTeamMessage(SIXTH_TEAM,COLOR_WHITE,"SERVER: Sudden death! Keep running, your bed has been blown up! There is no respawn after death!"); new adstring[64]; format(adstring,sizeof(adstring),"SERVER: The bed of team %s {FFFFFF}blew up!",SIXTH_TEAM_COLOR_TAG); SendClientMessageToAll(-1,adstring); GangZoneHideForAll(TEAM_ZONE_SIX); } #endif #endif }
Da habe ich versucht das ganze nun zu reduzieren, indem ich fuer die Bedobjekte ein Array erstelle, und da habe ich mir dann eine Funktion gebaut IsPlayerInRangeOfBed.
CBedArray[FIRST_TEAM]= CreateObject(1794,268.1000100,1881.5000000,-31.4000000,0.0000000,0.0000000,0.0000000); //object(low_bed_3) (1) // Team Grey BedArray[SECOND_TEAM]= CreateObject(1798,434.5000000,2546.8999000,15.2000000,0.0000000,0.0000000,268.0000000); //object(swank_bed_1) (1) // Team Blue BedArray[THIRD_TEAM]= CreateObject(1801,-773.5999800,2421.3000000,156.1000100,0.0000000,0.0000000,0.0000000); //object(swank_bed_4) (1) // Team Red
C
Alles anzeigenIsPlayerInRangeOfBed(playerid,range) { new k = sizeof(BedArray); while (k --> 0) { new Float:px, Float:py, Float:pz, Float:ox, Float:oy, Float:oz; GetObjectPos(BedArray[k],ox,oy,oz); GetPlayerPos(playerid,px,py,pz); new Float:dist = floatabs(px,py,pz,ox,oy,oz); if(dist == range || dist < range) { return k; } return -1; } }
Aber geht das effizienter? Sollte ich die BED_STATEs eventuell auch in ein Array packen? Wie sollte das dann aufgebaut sein das Array? Eventuell ein Monodimensionales Array, bspw. BedStates[TEAMSIZE]?
Das ist mein jetziger Ansatz, gefaellt mir aber noch nicht ganz, und ist noch nicht komplett fertig, weil ich da wieder tausende BED_STATE Abfragen haben werde.
C
Alles anzeigenif(strcmp(cmdtext, "/blowup", true) == 0 && GameHasStarted == 1) { new Float:health; GetPlayerHealth(playerid,health); new bedteamid=IsPlayerInRangeOfBed(playerid,3.0); if(running !=1 && bedteamid != -1 && health > 0 && !IsPlayerInAnyVehicle(playerid)) // In this script we deal with players only { if(bedteamid == gPlayerTeamSelection[playerid]) return SendClientMessage(playerid, COLOR_WHITE, "SERVER: You cannot blow up the bed of your own team!"); running = 1; PlayerInfo[playerid][pBeds]=GetPlayerScore(playerid); SetTimer("BlowUpThisBed", bombtimer, false); if(BedStates[bedteamid] != 0) { SendClientMessageEx(playerid, COLOR_WHITE, "SERVER: You are blowing up the bed of Team %s ",GetTeamColorTag(bedteamid)); BedStates[bedteamid] = 0; } PlayerInfo[playerid][pBeds]+=1; SendClientMessage(playerid, COLOR_WHITE, "SERVER: Planted Bomb Successfully. Lets Blow This Bed Up!"); SetPlayerScore(playerid, GetPlayerScore(playerid) + 1); SendClientMessage(playerid, COLOR_WHITE, "SERVER: Keep Running! Bed Will Blow Up In 5 seconds!"); GetPlayerPos(playerid, x1, y1, z1); ApplyAnimation(playerid, "BOMBER", "BOM_Plant_Loop", 4.0, 1, 0, 0, 1, 1); for(new k = 0; k < MAX_PLAYERS; k++) { PlayerPlaySound(k,7416,x1,y1,z1); } CountDownTimer = SetTimer("CountDown", 1000, true); return 1; } return 0; } return 1; }
Jedoch muesste ich dann ueber CountDown die bedteamid die Teamid an CountDown, und von CountDown an BlowUpThisBed schicken.
Bei BlowUpThisBed wuerde ich die teamid des Bettes uebergeben, und so ca. 90 Zeilen sparen.
C
Alles anzeigenpublic BlowUpThisBed(teamid) { CreateExplosion(x1, y1, z1, 7, 10.0);//'heavy' explosion close to bed CreateExplosion(x1, y1, z1, 9, 10.0); running=0; printf("Blow Up This Bed called"); if(BedStates[teamid] == 0) { SendTeamMessage(FIRST_TEAM,COLOR_WHITE,"SERVER: Sudden death! Keep running, your bed has been blown up! There is no respawn after death!"); new adstring[64]; format(adstring,sizeof(adstring),"SERVER: The bed of team %s {FFFFFF}blew up!",GetTeamColorTag(teamid)); SendClientMessageToAll(-1,adstring); GangZoneHideForAll(TEAM_ZONE_ONE); } }
-
@Kaliber
Es funktioniert, jedoch musst du mir mal erklaeren was es mit diesem @, und dem Funktionsaufruf da mitten drin auf sich hatHabe das nun so abgewandelt
C
Alles anzeigen@AFK_CHECK();@AFK_CHECK() { for(new i=GetPlayerPoolSize(); i!=-1; i--) { if(!IsPlayerConnected(i) || IsPlayerNPC(i) || !AFK_SYS[i] || (gettime()-AFK_SYS[i]) < 120) continue; Kick(i); //i = playerid die 2min (120 Sekunden) AFK war new name[MAX_PLAYER_NAME + 1]; GetPlayerName(i, name, sizeof(name)); new k=MAX_PLAYERS; while( (k--)> 0) { SendClientMessageEx(k,COLOR_WHITE,"SERVER: %s (%d) has been kicked due to inactivity",name,i); } AFK_SYS[i] = 0; } return 1; }
-
In einem Deathamtch aehnlichen System, wo du den letzten Spieler vernichten muss um zu gewinnen ist das schon ein muss finde ich.
Sonst geht der einfach auf den Desktop und man kann ihn nicht vernichten. -
Ja habe gegoogelt und bei der Anzahl an Sachen aufgegeben.
Am besten so etwas, was erkennt wenn der Spieler so eine Sanduhr neben seinem Namen hat, und sich fuer 2 Minuten nicht bewegt. Der soll dann gekickt werden, mehr nicht -
Kennt jemand ein vernuenftiges AFK System?
-
Prima Vielleicht mag sich ja jemand die Tage mal als Tester probieren. Die meisten Sachen kann man alleine schwer testen.
-
Was ist die Standardfarbe von der Dialogschrift in den Dialogboxen?
Weil ich nutze fuer mein TEAM_COLOR_TAG eine Inline Farbe, und dannach wird das ja so weitergemacht. Jedoch will ich da wieder auf die normale Farbe wechseln. -
Danke Typisch Kaliber.
Deine Loesung hat nur 1/8 der Codelaenge meiner Loesung und funktioniert prima. Vielen Dank nochmal. -
Danke euch!
Habe nun noch eine kleine Sache.
Habe hier den Teil dank @Kaliber, mit welchem ich jetzt mein Scoreboard machen kann.
Aber wie packe ich das ganze vernuenftig in den Dialog?Ich will dort nur die Spieler angeben die ich auch drin habe, also wenn ich bspw. nur 2 Spieler habe, soll in dem String kein 3rd place etc sein.
Dementsprechend faellt ja auch abhaengig von der Spieleranzahl die Anzahl an Arrayeintraegen niedriger aus die ich in Format reinpacke.Versteht man das was ich vor habe?
Ist das eventuell zu aufwaendig umzusetzen?Eine Idee waere fuer jeden Platz einen eigenen String zu machen, und dann in nem Switch case zu schauen wieviele Spieler tatsaechlich drin sind, und dementsprechend fuer jeden Fall eine eigene Format Linie.
C
Alles anzeigenFinishedGame() { new scoreTable[MAX_PLAYERS][2], idx; for(new i = GetPlayerPoolSize(); i!=-1; i--) { if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue; scoreTable[i][0] = playerdataInfo[i][pKills]; scoreTable[i][1] = i; } SortDeepArray(scoreTable, 0, .order = SORT_DESC); new scorestring[512]; new minutes,seconds; minutes = totaltime / 60; seconds = seconds % 60; format(scorestring,sizeof(scorestring),"Duration of the game: %d:%d \n 1st Place: ",minutes, seconds,); ShowPlayerDialog(playerid, 1234, DIALOG_STYLE_MSGBOX, "Scoreboard",scorestring, "", ""); SetTimer("GMX",15000,false); return 1; }
-
Danke dir, der Fehler ist weg. Jedoch muss ich mal den Gamemode komplett auf den Kopf stellen, denn jegliche Aenderungen an den forwards und Variablen, egal ob hinzufuegen oder entfernen fuehrt zu einem crashen des Compilers
//edit: Sehe gerade, wenn ich #include <YSI\y_ini> von meinem Mode streiche kackt der Compiler ab, ohne das zu streichen geht er ohne Fehler durch heh.
Die einzige Funktion die ich zu nutzen scheine ist strcpy.//edit2: Habe gerade mal eine andere strcpy Funktion direkt im Script implementiert, aber auch dann schmiert der Compiler ab. Wird vielleicht irgendwas aus den YSI Bibliotheken genutzt was ich nicht weiss?
-
Alles klar, werde ich mal probieren!
Nun ein anderes kleines Problem.
Habe 2 gloable Variablen welche ich nicht mehr nutze, welche nirgendwo gebraucht werden, und deshalb warnings bringen.
Wenn ich diese streiche schmiert jedoch der Compiler immer ab, wie geht man da bei der Fehlersuche am besten vor?
Weil die werden letztendlich nur einmalig im Script genutzt, undzwar da wo ich die definiere. -
@Sub Royal Anstatt so viel redundanten Code zu haben, würde ich einfach *_TEAM_COLOR_TAG in ein Array schmeißen und per remainingTeamID auf den jeweiligen Index zu greifen. Dann hast du deutlich weniger Zeilen, sparst dir das mit den Markos und das hinzufügen / entfernen weiterer Teams (im Allgemeinen die Wartbarkeit) erleichtert sich deutlice
Danke dir schonmal dafuer. So werde ich definitiv viele hundert Zeilen an Code einsparen.
Wie ist es jedoch am effizientesten die Strings in den Arrays zu speichern? Genau da scheiter ich gerade heh. Sowas habe ich nie zuvor probiert.Habe folgendes 2D Array dazu erstellt, wie packe ich am besten die Strings dort rein, und wie rufe ich diese ab? (Strings sind die TEAM_COLOR_TAG Werte) Bspw. per strcpy?
TEAMSIZE ist maximal 6, je nachdem wieviele Teams ich eingestellt habe.
-
So mein Rundensystem konnte ich bereits beheben
Nun bleibt noch das Problem: Ich brauche eine Funktion um zu checken welches Team das einzig uebrig gebliebene ist.
Um zu schauen wieviele aktive Teams es gibt habe ich eine Funktion GetActiveTeamCount(), welche die Anzahl der aktuell exisitierenden Teams returned.
Die Teams haben IDs 1-6.
Weiterhin soll die Funktion die ID des letzten verbleibenden Teames returnen (Abgefragt das nur noch ein Team exisitert wird durch eine if Bedingungen mit GetActiveTeamCount == 1))Hat da jemand eine Idee wie ich das realisiere? Bisher habe ich den Ansatz mit der rekursiven Funktion, jedoch ist der maximal wartungsunfreundlich, und ich kann nach fast 2 Jahren die FUnktion nicht mehr genau nachvollziehen.
C
Alles anzeigenstock TeamsAlive(bool:value) { new i=0,count=0; while(i<TEAMSIZE) { if(GetTeamPlayerCount(i) > 0) { count++; } i++; } if(bool:value == false) switch(count) { case 1: { switch(TeamsAlive(true)) { case FIRST_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",FIRST_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",FIRST_TEAM_COLOR_TAG); } } case SECOND_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",SECOND_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",SECOND_TEAM_COLOR_TAG); } } #if defined TEAMSIZE #if TEAMSIZE >= 3 case THIRD_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",THIRD_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",THIRD_TEAM_COLOR_TAG); } } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >= 4 case FOURTH_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",FOURTH_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",FOURTH_TEAM_COLOR_TAG); } } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >= 5 case FIFTH_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",FIFTH_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",FIFTH_TEAM_COLOR_TAG); } } #endif #endif #if defined TEAMSIZE #if TEAMSIZE == 6 case SIXTH_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",SIXTH_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",SIXTH_TEAM_COLOR_TAG); } } #endif #endif } for(new o;o<MAX_PLAYERS;o++) { ResetPlayerData(o); } FinishedGame(); } } return i; }
Weiterhin eine abgewandelte Funktion, welche beim Start prueft, ob mindetens 1 Spieler in mindestens 2 Teams ist, und wenn nicht, die IDs der jeweiligen Teams ausgibt wo ein Spieler fehlt.
Da ist ja die Schwierigkeit dass ich nicht 2 IDs auf einmal returnen kann.//edit: Ersteres habe ich bereits hinbekommen.
C
Alles anzeigenTeamRemaining() { new remainingTeamID; if(GetActiveTeamCount() < 2) { for(new i;i<TEAMSIZE;i++) { if(GetTeamPlayerCount(i) > 0) { remainingTeamID=i; break; } else { continue; } } } else { return 0; } switch(remainingTeamID) { case FIRST_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",FIRST_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",FIRST_TEAM_COLOR_TAG); } } case SECOND_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",SECOND_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",SECOND_TEAM_COLOR_TAG); } } #if defined TEAMSIZE #if TEAMSIZE >= 3 case THIRD_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",THIRD_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",THIRD_TEAM_COLOR_TAG); } } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >= 4 case FOURTH_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",FOURTH_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",FOURTH_TEAM_COLOR_TAG); } } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >= 5 case FIFTH_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",FIFTH_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",FIFTH_TEAM_COLOR_TAG); } } #endif #endif #if defined TEAMSIZE #if TEAMSIZE == 6 case SIXTH_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",SIXTH_TEAM_COLOR_TAG); printf("SERVER: All remaining teams have been wiped. Team %s has won the game!",SIXTH_TEAM_COLOR_TAG); } } for(new o;o<MAX_PLAYERS;o++) { ResetPlayerData(o); } FinishedGame(); #endif #endif } return 1; }
Jedoch habe ich da noch irgendas drinnen was den Compiler crasht.
-
Ich erkenne den Sinn mancher Funktionen wie z.B. GetActiveTeamCount nicht. Poste uns doch den Inhalt dieser Funktionen damit wir tiefer in die Zusammenhänge deines Systems blicken könnten. Ich hätte einige verbesserungsansätze aber erkenne noch nicht ganz die tiefe des Codes und könnte somit versehentlich dein Code breaken.
Alles klar!
Habe hier mal den Gamemode drin.Habe halt probiert moeglichst viele teambezogene Funktionen zu entwickeln, um besser mit Teams hantieren zu koennen im Script.
Und meine GetActiveTeamCount Funktion welche checken soll ob in einem Team ein Spieler ist.
-
Moin.
Ich will bei mir ein Rundensystem einfuegen. In meinem Gamemode gibt es 3 Teams, und wenn in mindestens 2 Teams mindestens 1 Spieler ist, soll ein Countdown starten.
Wenn zwischendurch Spieler rausgehen soll dieser wieder resettet werden.
Wenn der Countdown von 60 auf 0 runtergezaehlt hat sollen die Spieler gespawnt werden, und die Runde soll gestartet werden.Oder gibt es anderen Vorschlaege?
Weiterhin soll jeder User der nachher joint, automatisch dem Team TEAM_SPECTATOR zugewiesen werden, und die Spieler spectaten.Wenn ein Spieler rausgeht, und bspw. nur noch 1 Team da ist, soll FinishedGame() aufgerufen werden.
Ist das hier logisch umgesetzt? Und wann rufe ich am besten die Funktion StartGame() auf? Oder periodisch mit Timer?
Das ist mein bisheriger AnsatzCode
Alles anzeigenstock StartGame() { if(GetActiveTeamCount() > 1) { CountDownVar--; new str[128]; if(CountDownVar == 0) { KillTimer(CountDownTimer2); CountDownVar = 59; GameHasStarted =1; GameTextForAll("Start!",1000,1); for(new i = 0; i < MAX_PLAYERS; i++) { if(gPlayerHasTeamSelected(i)) { TeleportPlayerToBase(i); TogglePlayerControllable(i,1); ResetPlayerData(i); } } } else { format(str, sizeof(str), "Count Down: %d", CountDownTimer2); GameTextForAll(str, 1000, 1); } return 1; } else { CountDownVar = 59; } }
Hier die Funktion welche erkennt wenn eine Runde beendet ist.
Der rekursive Aufruf hier sinvoll?
Es funktioniert zwar so wie ich will, ist aber jedoch ziemlich wartungsunfreundlich.Code
Alles anzeigenstock TeamsAlive(bool:value) { new i=0,count=0; while(i<TEAMSIZE) { if(GetTeamPlayerCount(i) > 0) { count++; } i++; } if(bool:value == false) switch(count) { case 1: { switch(TeamsAlive(true)) { case FIRST_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",FIRST_TEAM_COLOR_TAG); } } case SECOND_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",SECOND_TEAM_COLOR_TAG); } } #if defined TEAMSIZE #if TEAMSIZE >= 3 case THIRD_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",THIRD_TEAM_COLOR_TAG); } } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >= 4 case FOURTH_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",FOURTH_TEAM_COLOR_TAG); } } #endif #endif #if defined TEAMSIZE #if TEAMSIZE >= 5 case FIFTH_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",FIFTH_TEAM_COLOR_TAG); } } #endif #endif #if defined TEAMSIZE #if TEAMSIZE == 6 case SIXTH_TEAM: { for(new d;d<MAX_PLAYERS;d++) { SendClientMessageEx(d,COLOR_WHITE,"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",SIXTH_TEAM_COLOR_TAG); } } #endif #endif } for(new o;o<MAX_PLAYERS;o++) { ResetPlayerData(o); } FinishedGame(); } } if(bool:value == true && count == 1)//Returns the ID of the remaining team return i; return 1; }