Autor |
|
|
Teamerkennung in WAC-Code |
|
|
|
Ich habe heute mal meine Teamerkennung für 60 Spieler ausgelegt, was von der Datei-Größe von 20 KiloByte noch in Ordnung war, aber beim Laden der MAP ist der Server bei knapp 95 Prozent hängen geblieben.
Erst als ich den Code auf 40 Spieler gekürzt habe, startete die Map vollständig.
Wie es dann bei einem vollen Server ist, kann ich schlecht abschätzen.
Scheinbar ist der WAC-Code innerhalb des PLOOPs zu groß,
wie Oldman schon vermutet hatte.
|
Beitrag vom 17.04.2007 - 18:49 |
|
|
|
|
Wie gesagt, ich werde meinen WAC-Code zur Teamerkennung preisgeben:
Erstmal eine Statusanzeige, um zu sehen was passiert.
text("-------------------------")
text#("Spieler anwesend",humans) // Statusanzeige
text("-------------------------")
text#("Slot 1 - PlayerID = ",v30)
text#("Slot 1 - TeamID = ",v40)
text("-------------------------")
text#("Slot 2 - PlayerID = ",v31)
text#("Slot 2 - TeamID = ",v41)
text("-------------------------")
text#("Tote blaue Spieler = ",v60)
text#("Tote rote Spieler = ",v61)
text("-------------------------")
text#("aktive blaue Spieler = ",v62)
text#("aktive rote Spieler = ",v63)
text("-------------------------")
text(".")
Als erstes werden alle virtuellen Slots ( entsprechen nicht denen des Servers ) überprüft und zurückgesetzt.
if (v50 == 0) and (v30 != 99) then // Slot unbelegt, aber Spieler zugewiesen
if v40 == 1 then dec(v62) endif // -1 blauer Spieler
if v40 == 2 then dec(v63) endif // -1 roter Spieler
v30 = 99 // PlayerID zurücksetzen
v40 = 99 // TeamID zurücksetzen
else
v50 = 0
endif
Mit der Variable v50 (Spieler 1) bis v59 (Spieler 10) überprüfe ich, welche Slots belegt sind.
In der Variable v30 (Spieler 1) bis v39 (Spieler 10) speicher ich die SpielerID aus der "player"-Variable.
PLOOP
if SSNnearSSN(player,SSN_blauer_Spawnpoint,10) or SSNnearSSN(player,SSN_roter_Spawnpoint,10) then
v201 = 0
Hier beginnt die Überprüfung der Spieler.
Wenn ein Spieler "player" 10 Meter in der roten Zone "SSN_rote_Zone" oder 10 Meter in der blauen Zone "SSN_blaue_Zone" ist, wird der Spieler überprüft, ob dieser in den virtuellen Slots gespeichert wurde.
if (player == v30) or (player == v31) or (player == v32) or (player == v33) then v201 = 1 endif
if v201 == 0 then // neuer Spieler vorhanden
Wenn in einen der Variablen v30 bis v39 seine SpielerID "player" gespeichert ist, wird keine Slotzuweisung benötigt.
Wenn es doch ein neuer Spieler ist, dann wird folgendes ausgeführt.
if (v30 == 99) and (v201 == 0) then // Slot unbelegt und neuer Spieler nicht zugewiesen
V30 = player // SpielerID zuweisen
v201 = 1 // neuer Spieler
if SSNnearSSN(player,SSN_blauer_Spawnpoint,10) then // Spieler am blauen Startpunkt
v40 = 1 // blaues Team
inc(v62) // +1 blauer Spieler
endif
if SSNnearSSN(player,SSN_roter_Spawnpoint,10) then // Spieler am roten Startpunkt
v40 = 2 // rotes Team
inc(v63) // +1 roter Spieler
endif
endif
endif
Diese obige Bereich wird für jeden virtuellen Slot einmal benötigt, entsprechend die Variablen v30 (v30 bis v39) und v40 (v40 bis v49) angepaßt.
Mit v200 = 1 lege ich fest, das der neue Spieler einem freien Slot zugewiesen wurde,
nun wird überprüft, in welcher Zone der Spieler aufgespawnt ist, entsprechend den Wert 1 (blaues Team) bzw. 2 (rotes Team) in die Variable v40 (v40 bis v49) geschrieben und den Zähler für blaue Spieler (v62) bzw. rote Spieler (v63) hochgezählt.
endif
endif
if (player == v30) then
v50 = 1 // Slot ist belegt
if (v40 == 1) and ssndead(player) then inc(v60) endif // blauer Spieler ist tot
if (v40 == 2) and ssndead(player) then inc(v61) endif // roter Spieler ist tot
endif
END
Hier wird festgelegt, welcher Slot (v50 bis v59) von einem Spieler belegt wurde.
Zudem wird überprüft, ob der Spieler evtl tot ist, dann wird entsprechend der teamzugehörigkeit die VAriable v60 bzw. v61 hochgezählt.
Soweit ist dir Teamzuweisung beendet.
Anwenden kann man sie zum Beispiel mit folgender Abfrage.
if (player == v30) and (v40 == 2) then SSNaddHP(player,-20) endif // Slot 1 = SpielerID und rotes Team ?
bzw.
if (player == v30) and (v40 == 1) then SSNaddHP(player,-20) endif // Slot 1 = SpielerID und blaues Team ?
Entsprict die SpielerID (v30 bis v39) dem aktuellen Spieler (player) und der Teamzugehörigkeit (v40 bis v49)
wird dem Spieler 20 Hitpoints abgezogen.
Die Texte "SSN_blauer_Spawnpoint" und "SSN_roter_Spawnpoint" müssen natürlich mit den wirklichen SSN-Numbers der Objekte ersetzt werden.
Auf Wunsch starte ich auch einen Server mit meiner Beispiel-Map, um zu zeigen, das es auch funktioniert.
Aber leider nur bis zu den getesteten 40 Slots und einem Spieler !!!
Auf der Karte dürfen auch keine Spawnpoints genutzt werden , die von einem anderen Team übernommen werden können.
Eraser-EMC2-
PS: Jetzt würde ich gerne den nicht funktionierenden WAC-Code der NOTAPs sehen.
Vorallem, wenn dieser nicht funktioniert, warum dann die heimlichtuerei.
EDIT:
Wenn jemand die Funktion meines WAC-Codes in eigene Maps einbaut, verlange ich, das die MAP auch öffentlich downloadbar ist.
Nach dem Motte von der JO-Community für die JO-Community.
Dieser Beitrag wurde 1 mal editiert, zuletzt von Eraser-EMC2- am 20.04.2007 - 20:14.
|
Beitrag vom 20.04.2007 - 20:02 |
|
|
|
21 Beiträge - Grünschnabel
|
|
|
Moin Eraser, wieso nicht funktionierend?
z.B:
Editiert von KR-Nevada und IKARUS ~RSU~
Bei der ColdBlood wird erkannt in welchem Team ein Spieler ist. Wenn er seine Base verlässt wird er getötet. Wenn ein
blauer Spieler getötet wird, wird die Blendung durch die Sonne für die roten Sniper für einige Zeit reduziert.
Bei der Duell Map wird erkannt welcher Spieler von welchem Team in der Arena ist. Wenn einer der Spieler in der Arena stirbt bekommt der überlebende ein Target.
Zitat Wenn jemand die Funktion meines WAC-Codes in eigene Maps einbaut, verlange ich, das die MAP auch öffentlich downloadbar ist.
Nach dem Motte von der JO-Community für die JO-Community. |
Das ist dein gutes Recht aber halt kaum durchsetzbar, wenn man etwas bereitstellt wird es benutzt. In diesem Fall wird es allerdings wenige geben die es nutzen da es deutlich über Copy/Paste Niveau liegt.
Eine Trennung von Code und Erklärung würde die Verständlichkeit verbessern. Wenn du das mischen willst dann benutze die Erklärungen doch als Kommentar.
Was ist die genaue Problemstellung? Ich sehe hier immer Lösungsansätze ohne Problem- oder Aufgabendefinition?
Ich vermute:
Ordne die Spieler einem Team zu damit diese teamspezifisch behandelt werden können?
Eine allgemaine Lösung dürfte zu aufwändig werden, insbesondere da sie ja von euch immer für 64 Spieler gefordert wird (dabei gibt es ja auch IC Server mit noch mehr Spielern), aber auf derartigen Servern laufen auch keine High-End Special Maps, oder?
Die Verwendung vieler verschiedener Variablen pro Spieler verstehe ich immer noch nicht. Ich nehme eine pro Spieler.
Ist der Spieler am Leben und im Team 1 dann hat die den Wert 1, bei Rot 2. Ist ein Blauer tot dann 3, als Roter 4.
Ein nicht belegter Slot wird in der Variablen als 0 vermerkt.
Gruß
MaBöse
Dieser Beitrag wurde 3 mal editiert, zuletzt von KR-Nevada am 22.04.2007 - 11:05.
|
Beitrag vom 21.04.2007 - 00:53 |
|
|
|
|
Zitat
Die Verwendung vieler verschiedener Variablen pro Spieler verstehe ich immer noch nicht. Ich nehme eine pro Spieler.
Ist der Spieler am Leben und im Team 1 dann hat die den Wert 1, bei Rot 2. Ist ein Blauer tot dann 3, als Roter 4.
Ein nicht belegter Slot wird in der Variablen als 0 vermerkt.
|
Bei deiner Lösung nutzt du die SSN(100xx), dabei kommt man auch mit einer Variable aus, da hast du vollkomen recht.
Mit der SSN(100xx) hast du schon eine Slot-Zuweisung (ersetzt Variabale Nr.1) und mit SSNExists(100xx) kann man abfragen, ob der Spieler auch vorhanden ist (ersetzt Variable Nr.2).
Somit kommt bei auch wirklich nur auf eine Variable, die die Teamzuweisung speichert.
Das ist mir auch bekannt und selbst getestet.
Nur ich wollte zeigen, das es auch mit dem PLOOP geht, das hatte ich auch die ganze Zeit gesagt und dabei brauche ich nun mal 3 Variablen.
Eine um die Teamzuweisung zu speichern und 2 Variablen um zu erkennen welche Spieler noch im Spiel sind. Da die PlayerID während des Spieles wechseln und das es in Joint Ops keine Arrays gibt, mußte ich den Spielern feste Variablenfolgen vergeben und dazu brauchte ich nun die dritte Variable.
Wie schon gesagt, das alles braucht man nicht bei SSN(100xx).
Scheinbar hast du die Problematik mit dem PLOOP und der Teamzuweisung noch nicht erkannt, sonst würdest es nicht schreiben und auf deine 1 Variable Lösung verweisen.
Zitat Was ist die genaue Problemstellung? Ich sehe hier immer Lösungsansätze ohne Problem- oder Aufgabendefinition? |
Wieso muß man immer erst warten, bis jemand um Hilfe ruft und ein Problem hat ?
Man kann doch schon vorher sein Wissen preis geben, auch wenn es nach einer Woche ist .
Editiert von KR-Nevada und IKARUS ~RSU~
Und zu dazu :
Zitat wieso nicht funktionierend? |
In deinem Forum steht in einem Beitrag vom 12 April folgendes :
Zitat Bei den MM's nähert man sich immer mehr der nicht funktionierenden und unmöglichen NOTAP Lösung an. Allerdings auf eine etwas unelegante Art mit 3 Variablen je Spieler.
http://web8.alpha626.server4you.de/phpkit/include....entries =15
Da kommt man auch mit einer Variablen je Spieler aus smile
Achso, ich denke bei MM muss immer alles offengelegt, geposted und zum Download bereitgestellt werden? |
Also eine "nicht funktionierenden und unmöglichen NOTAP Lösung".....
Zu der Zeit kanntest du meinen WAC-Code noch nicht, und die beiden Lösungen "PLOOP" und "SSN(100xx)" kann man nicht direkt vergleichen.
Man hat nun mal bei allem seine Vor- und Nachteile, und Äpfel kann man nicht mit Birenen vergleichen.
Ich würde trotzdem mal deine Lösung mit den SSN(100xx) sehen, ob ich dort die selben Lösungsansätze genommen habe.
Editiert von KR-Nevada und IKARUS ~RSU~
Dieser Beitrag wurde 3 mal editiert, zuletzt von KR-Nevada am 22.04.2007 - 11:17.
|
Beitrag vom 21.04.2007 - 11:02 |
|
|
|
|
@Eraser: Zitat "nicht funktionierenden und unmöglichen NOTAP Lösung"..... |
Also wenn das ernstgemeint war, dann hatte MaB damals nen verdammt schlechten Tag.
Ansonsten hört sich deine Lösung ganz vernünftig an, auch wenn manche Stellen etwas umständlich aussehn.
|
Beitrag vom 21.04.2007 - 11:39 |
|
|
|
|
Ich hatte schon einiges versucht, wenigstens auf 2 Variablen zu kommen oder den Umfang des WAC-Codes zu verringern.
Die Darstellung bzw. Zählung der (toten) Spieler des blauen und roten Teams war reine Spielerei.
Würde man es weg lassen, wäre der WAC-Code etwas kürzer, aber auch nicht für mehr Spieler lauffähig.
Bei dem Test, wieviele Slot überprüft werden können, hatte ich schon auf jedes unnötige Zeichen vezichtet, komplette IF-Abfragen nur in eine Zeile, usw. . Es hatte aber nicht mehr als 40 Slots gebracht.
Wie dann der Server mit 40 Spieler ausgelastet wird, konnte ich leider nicht testen.
EDIT:
Ich hatte auch schon eine interessante Idee mit dem SSN(100xx) und dem GLOOP.
Würde es gerne über Novaworld testen.
Dieser Beitrag wurde 1 mal editiert, zuletzt von Eraser-EMC2- am 21.04.2007 - 12:30.
|
Beitrag vom 21.04.2007 - 12:16 |
|
|
|
21 Beiträge - Grünschnabel
|
|
|
Editiert von IKARUS ~RSU~ und KR-Nevada
Der Inhalt wurde komplett gelöscht, da er nichts mit der Lösung an sich zu tun hat.
Gruß
MaBöse NOTAP
Dieser Beitrag wurde 2 mal editiert, zuletzt von KR-Nevada am 22.04.2007 - 11:49.
|
Beitrag vom 21.04.2007 - 13:20 |
|
|
|
|
Ich hab mich jetzt auch mal an einer anständigen Teamerkennung versucht, wobei ich sogar mit 2 Variablen auskomm. Ich hab aber verschachtelte PLOOPs drinnen, da bräuchte ich noch einen 2. Mann zum Testen. Allein gehts problemlos, aber keine Ahnung wies bei mehreren aussieht. Ich wollts schon mit GLOOP und Bots testen, aber item lässt sich nicht in ner Variable speichern, bei player scheints zu gehn.
@Eraser: Wenn ich später Zeit hab, können wir ja unsre beiden Skripte mal gegenseitig testen.
Dieser Beitrag wurde 1 mal editiert, zuletzt von Dragonheart am 21.04.2007 - 13:21.
|
Beitrag vom 21.04.2007 - 13:20 |
|
|
Gast |
|
|
|
|
Verschachtelte PLOOPs und GLOOPs gehen nicht, da beide die selbe interne Variable zur Speicherung des Zählers nutzen.
Deswegen bekommst du auch bei "player" und "item" den selben Wert angezeigt.
PLOOP
text#("Player = ",player)
text#("Objekt = ",item)
END
So etwas ähnliches hatte ich auch mit Seeminen vorgehabt.
Innerhalb eines PLOOPs einen GLOOP zu nutzen, alleine hatte es funktioniert, aber sobald ein zweiter Spieler dazu kam, ging es nicht mehr.
Zu meiner Lösung Team-Erkennung mit SSN(100xx) und GLOOP funktioniert die WAC theoretisch mit 64 Spieler.
Hatte gerade noch grobe Funktionsprobleme, die ich noch behebn mußte.
von Eraser-EMC2-
EDIT:
Zu zweit funktioniert es noch nicht, weiß noch nicht warum.
Dieser Beitrag wurde 2 mal editiert, zuletzt von Eraser-EMC2- am 21.04.2007 - 13:40.
|
Beitrag vom 21.04.2007 - 13:32 |
|
|
PLOOP-PLOOP-Verschachtelung |
|
|
|
Hm das GLOOP und PLOOP ineinander nicht gehn, kann ich mir vorstellen, aber es geht bei mir um eine PLOOP-PLOOP-Verschachtelung und bei der bin ich mir da nicht ganz so sicher. Hier mal der Code für 2 Spieler:
//v0-v60: SpielerIDs
//v100-v160: Teamvariable für den jeweiligen Spieler
//v97: Zählervariable für Teamlose Spieler
//v98: Zählervariable für PLOOPs
//v99: Ersatzvariable für player
if never then
v0=99
v1=99
fallmps=1000
endif
v98=0
PLOOP
if v98==0 and v0==99 then
v0=player
endif
if v98==1 and v1==99 then
v1=player
endif
//...
inc(v98)
END
PLOOP
v99=player
if ssnnearssn(player,blauerspawn,10) then
player=0
v98=0
PLOOP
if v98==0 and v0==v99 then
v100=1
endif
if v98==1 and v1==v99 then
v101=1
endif
//...
inc(v98)
END
endif
if ssnnearssn(player,roterspawn,10) then
player=0
v98=0
PLOOP
if v98==0 and v0==v99 then
v100=2
endif
if v98==1 and v1==v99 then
v101=2
endif
//...
inc(v98)
END
endif
player=v99
END
v97=0
//check for non-existing players teams and IDs
if past(0) then
if not ssnexists(v0) and v0!=99 then
v0=99
v100=0
else if ssnexists(v0) and v100==0 then
inc(v97)
if past(2) and elapse(10) then
text("Hinweis fuer Spieler 0: Fuer Teamzuweisung bei X spawnen!")
endif
endif
if not ssnexists(v1) and v1!=99 then
v1=99
v101=0
else if ssnexists(v1) and v101==0 then
inc(v97)
if past(2) and elapse(10) then
text("Hinweis fuer Spieler 1: Fuer Teamzuweisung bei X spawnen!")
endif
endif
//...
endif
if past(2) and elapse(10) then
consol("------------------------------")
consol#("Teamlose Spieler: ",v97)
consol("------------------------------")
endif
Ich muss aber gleich weg, also wenn ihr jetzt schon testen wollt, dann müsst ihr schnell ne eigene Map basteln, ich komm erst Spätnachmittag bis Abend wieder.
Dieser Beitrag wurde 1 mal editiert, zuletzt von Dragonheart am 21.04.2007 - 13:51.
|
Beitrag vom 21.04.2007 - 13:49 |
|
|
|
110 Beiträge - Gelegenheitsposter
|
|
|
Gelöscht von IKARUS ~RSU~ und KR-Nevada
|
OldMan |
Dieser Beitrag wurde 2 mal editiert, zuletzt von KR-Nevada am 22.04.2007 - 11:27.
|
Beitrag vom 21.04.2007 - 13:58 |
|
|
|
|
Mit dem SSN(100xx) funktioniert es,
nur ich wollte einen kürzen weg mit dem SSN(100xx) und GLOOP testen,
und dieses funktioniert nicht so wie ich gedacht hatte.
Editiert von IKARUS ~RSU~ und KR-Nevada
Dieser Beitrag wurde 7 mal editiert, zuletzt von KR-Nevada am 22.04.2007 - 11:38.
|
Beitrag vom 21.04.2007 - 14:52 |
|