[Theorie][Online Game] Gegner/Mob Synchronisation auf 3D Maps

07/21/2013 14:43 _Pancakes_#1
Schönen guten Tag,


Ich programmiere seit ein paar Wochen an einem kleinen Online-Game.
Ich verwende die Blender Game Engine und programmiere darin in Python.
Das Game soll eine Art Deathmatch in 3D werden.
Der Server ist ein von mir kleines Programmiertes Python Script, welches mit UDP Sockets (sowie der Client) kommuniziert.


Die Spieler können sich bis jetzt einloggen(Username/Password), spawnen und können sich bewegen.
Die Player Synchronisation ist fertig. (Location + Rotation) ( Animation Sync fehlt noch )

Mein Problem jetzt ist das ich gerne einen Gegner im Form eines Bäres auf die Karte setzen möchte.
=> Der Bär soll bei allen Spieler auf der GENAU GLEICHEN POSITION sein und GENAU DAS GLEICHE TUN.

Sprich also eine "NPC Synchronisation".

Mein Problem ist jetzt das ich theoretisch im Serverscript erkennen könne wenn jetzt z.B ein Spieler zu nah am Bär ist
dementsprechend den Bär langsam zu der X / Y / Z Achse des Spielers zu bewegen.

Das Problem ist das mein Serverskript nicht weiss wo die Erhöhungen sich auf der 3D Map befinden (Der Bär "schwebt" also durch z.B Bäume und Berge)

Wie lösen das Games wie WoW / Rift / Tera usw. ?
Diese Games sind ja MMORPGS und übertragen anmassen an Mobs!


Meine Ideen wären dazu:



1.) Das Serverskript in Form einer Blender Executable zu erstellen die genau die gleiche Map enthält wie die Clienten.


Vorteile:

- Sicherer gegen Cheats (Teleport Hacks) X/Y/Z Achse wird selb berechnet! ( der Player sendet nurnoch in welche Richtung er läuft)

Nachteile:

- Performance!
- Verschiedene Games gleichzeitig sind schwer umsetztbar.

2.) Einen zufälligen Clienten bestimmen der den Bär steuert und die Logik behandelt.

Vorteile:

- Einfach programmiertechnisch durchsetztbar

Nachteile:

- Disconnect?
- Cheat?


Was würdet Ihr mir vorschlagen? Bin sehr begeistert von dieser Thematik und freue mich auf JEDE Antwort! =)

Ich bedanke mich im Voraus für alle Antworten. =)

Mit freundlichen Grüssen,

the greedy Pancake-Cat aka. _Pancakes_ ^^

Eine neue Idee meinerseits:

3.) Server vergibt Spawnpoint des Bärens und schickt dann einfach nurnoch in welche Richtung er läuft.

Vorteil:

- X/Y/Z Achse vollkommen richtig.
- Programmiertechnisch einfach

Nachteil:

- Bär hat eine sehr sehr geringe Logik ( Da ich nicht mit Blender arbeite sondern nur per Skript ) ( -> Blender kann Steering, Distance usw -> kleine KI möglich)
- Cheats?


Mit freundlichen Grüssen,

_Pancakes_
07/22/2013 15:03 dready#2
Gelöst wird es normalerweise dadurch das der Server die Karte kennt und das Pathfinding der Mobs diese mit einbezieht.

zu 2. Niemals ;) Logic gehört nicht auf die Clientseite, im Idealfall macht der Client nichts anderes als Darstellen. Sollte nicht Perfomancentechnische Gründe verhindern das es auf dem Server läuft hat es auf dem Client nie etwas zu suchen. Du würdest dich wundern wieschnell Leute dahinerkommen ;)
Immer an den obersten Grundsatz bei sowas halten:
Der Client ist in Feindeshand und wird NIE verlässliche Werte übergeben. Sollte tatsächlich Berechnungen von ihm kommen sollte man sie Checken.
07/22/2013 22:29 _Pancakes_#3
Super Antwort!
Hab mich richtig darauf gefreut sie zu lesen! :handsdown:

Ich werde also auf meine erste Methode zurückgreifen.
Also wird der Server eine Blender Executable sein die über die exakt gleiche Karte wie der Client verfügt. Client sendet nurnoch z.b "bewege_nach_vorne" und der Server berechnet die X/Y/Z und Rotation selber.
Der Client stellt nurnoch dar.


Mit freundlichen Grüssen,

_Pancakes_
07/23/2013 21:20 _Roman_#4
Richtig. Denn wenn diese wichtigen Sachen wie die Berechnungen im Client gemacht werden, kommt natürlich irgendeiner auf die Idee Cheatengine zu benutzen und dann haste ganz schnell nen Hack zusammen.