[C++/PHP] Game Server

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 11-09 00:04
Ik ben samen met een team van ontwikkelaars bezig met het schrijven van een stabiele Game Server voor verscheidene MMORPG, het gaat hier niet om een emulator maar om een server!

Om dit zo goed mogelijk te realiseren hebben we gekozen om Server Side Scripting (SSS) te gaan gebruiken, zo kunnen we de core applicatie closed source houden en de rest opensource maken. De core houd zich bezig met het decoderen en zenden van packet's als tevens een aantal andere dingen die voor elke game nodig zijn.

We wouden als SSS gaan gebruik maken van PHP, omdat dit veel overeenkomsten heeft met c++, makkelijk te leren is en zeer goed gedocumenteerd.

Het is de bedoeling dat de core de packet's decodeert (oppcode, packetdata, ect), hierna controleert deze of er ook een functie in de SSS Cache is met deze naam. Een voorbeeldje ter verduidelijking:

De core laat tijdens de start up procedure alle php files in het geheugen daarna bouwt deze een index waarin all functies staan en de core checkt dus bij elk ontvangen oppcode of er ook een functie is met deze naam (in PHP).

De server ontvangt nu OPP_ATTACK, deze functie bestaat.
OPP_ATTACK_1($data)
{

if($data = 0) return 0;

if($data = DX560)
{
sendpacket('OPP_ATTACK DX402')
return 1;
}
elsev
{
return 0;
}

}
De functie sendpacket is een alias voor de functie SendPacket in de core (C++).
Bij een return van 1 is de operatie geslaagd, en bij een return van 0 gefaald.


De server voert deze functie uit en print bij 0 failed en 1 succes in de console van de server.

Het idee is dus heel simpel maar het is ons niet gelukt dit toe te passen aangezien we geen idee hebben hoe we dit kunnen realiseren. Alle hulp en tips zijn dus van harte welkom! _/-\o_

Ik heb het geprobeerd zo duidelijk mogelijk uit te leggen, maar mocht er iets onduidelijk zijn post maar !

http://www.tweakers.net/gallery/119170/sys


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

En nu moeten wij het voor je gaan schrijven? Zo werkt het hier niet. ;) Wat heb je zelf al geprobeerd? Wat lukte daar niet aan?

Als je moeite hebt met het checken of een functie bestaat en het aanroepen van een functie die je als string binnen krijgt: function_exists en call_user_func. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 11-09 00:04
Nou, het is misschien niet helemaal duidelijk maar het gaat om om C++ dat alle functie in leest in het geheugen en vandaar uit checkt of de functie bestaat in de PHP code (php code hoeft niks te checken)!

Dus aan functies als function_exists zijn vrijwel overbodig! Het nalaten checken of een bepaalde needle voorkomt in een array is geen probleem (c++). Maar het eerste eens in lezen van alle functie die er zijn is erg lastig!

Het gaat niet om een php web applicatie of iets dergelijks, het gaat om een Game server geschreven in C++ die PHP kan begrijpen en uitvoeren (code uit een externe PHP bestand, bijvoorbeeld mailbox.php).

Edit:
Het zou leuk zijn als iemand het kant en klaar heeft liggen, maar dat was niet de bedoeling. Een tip of ervaring van hoe andere dit hebben gerealiseerd, of hoe dit gedaan kan worden.

[ Voor 16% gewijzigd door codeneos op 27-11-2005 18:59 ]

http://www.tweakers.net/gallery/119170/sys


Acties:
  • 0 Henk 'm!

Verwijderd

Hoe wil je het gaan opzetten kwa connectie? Moet het via http protocol werken (dmv get/posts), of wil je een eigen service gaan schrijven met php (dus aanroep via CLI)? Of hoe was je dit van plan om te gaan realiseren?

Je kan met PHP CLI makkelijk een service bouwen, zo bijvoorbeeld een telnet systeem, of net wat je van plan bent om op te bouwen. Eigenlijk kan je met PHP alles doen wat je wil, maar ik van de week mijn glazen bol laten vallen, dus die ik nou kapot, daardoor weet ik niet wat je nou van plan bent.

Heb je verder enige ervaring met php, of iemand in het team? Volgends "mij" is die ervaring er niet echt, dus in dat geval wens ik je veel succes met leren ;)

[edit]
Bah, een reactie voordat ik klaar was, dan gaat de hele post niet meer echt op hé ;)

Wat voor ranzige constructie ben je in hemelsnaam aan het bouwen als ik vragen mag? Blijf bij 1 taal, en ga geen wrappers schrijven om binnen C++ php te laten werken (of in ieder geval de zelfde syntax). Blijf dan bij PHP, want dat kan je perfect via de CLI laten draaien, zonder webserver/etc.
Maargoed zoals je het hier uitlegt dan mis ik in ieder geval een aantal dingen (kan natuurlijk ook aan mij liggen, maar dat verwacht het niet):
• Wat ben je in hemelsnaam aan het maken, en waarom heb je deze constructie gekozen?
• Ik mis de link, waarom je kiest voor php wrapper (of hoe je het wil benoemen) binnen C++?
• Leg eens duidelijk uit wat je nou aan het bouwen bent ;)

@ -MNe- hier onder: same :)

[ Voor 43% gewijzigd door Verwijderd op 27-11-2005 19:04 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat is het nu dat het PHP gedeelte moet doen? En wat moet het C++ gedeelte doen? En wat is het nou precies wat je zelf niet snapt? Concreet: wat is nu precies je vraag?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 11-09 00:04
Verwijderd schreef op zondag 27 november 2005 @ 18:58:
Hoe wil je het gaan opzetten kwa connectie? Moet het via http protocol werken (dmv get/posts), of wil ...
Heb je verder enige ervaring met php, of iemand in het team? Volgends "mij" is die ervaring er niet echt, dus in dat geval wens ik je veel succes met leren ;)
We hebben wel ervaring met PHP coderen. het gaat niet via GET/POST en via de CLI interface van php is volgens mij niet mogelijk, php moet worden geintegreert in de server aangezien hij de functie SendPacket uit de C++ code moet kunnen aanroepen (dit is waarschijnlijk het moeilijks). De core handelt alle connecties af en stuurt de ontvangen packets door naar de PHP code.

Elke packet bevat een OPPCODE deze heeft een naam, bijvoorbeeld ACT_MOVE of GET_FRIENDS. De rest is data van een packet. Deze data moet de core door spelen aan de PHP code, dus stel de packet is '00 78 29 1F 90 28 90 67 45'. De core voert dus uit php functie: ACT_MOVE(00 78 29 1F 90 28 90 67 45). Deze kan een packet terug sturen naar de client! (de core decodeert alle packets en stuurt de bruikbare data naar de PHP functie (NIET VIA EEN WEB INTERFACE OF ZO DUS))

[ Voor 44% gewijzigd door codeneos op 27-11-2005 19:19 ]

http://www.tweakers.net/gallery/119170/sys


Acties:
  • 0 Henk 'm!

Verwijderd

Begrijp ik het volgende goed:

C++ Leest alle PHP bestanden in, en filterd daaruit de functienamen
C++ Krijgt een opcode binnen (een functieaanroep)
C++ Kijkt of hij dat ooit tegen is gekomen
C++ Execute als hij het ooit tegen is gekomen de desbetreffende functie in PHP.

Waarom maak je dan niet gewoon alles in C++?
Ben namelijk heel bang dat het vrij moeilijk word wat jij zo wil, vanuit C++ PHP code uitvoeren.


Edit: Ah al wat meer uitleg
Dus PHP moet de functie SendPacket (in C++) uitvoeren? Dat zal dan een eigengeschreven extension worden voor PHP, dan kan je gewoon in PHP SendPacket() doen.

Kijk dan eens hier >> http://www.zend.com/php/internals/extension-writing1.php
http://www.zend.com/php/internals/extension-writing2.php

Dan kan je al vanuit PHP C++ code uitvoeren.
Hoe je het andersom wilt doen, weet ik zo niet. (Ja CLi kan ja, maar denk niet dat hij zoiets wil)

[ Voor 40% gewijzigd door Verwijderd op 27-11-2005 19:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

@ Hel Gast, ja idd, erg lastig en vrij dubbel op lijkt me.

PHP kan perfect via de CLI draaien hoor, dat is geen enkel probleem.
code:
1
php.exe file.php

Je kan ook TCP/UDP/ICMP packets versturen via php sockets, dus je hoeft niet persee via C++ te doen. Waarom dat je nou echt dit @ C++ probeert dat volg ik niet helemaal, maar ik zie het nut er tot nu toe nog niet echt van in.

Als Hel Gast gelijk heeft, en je probeert een extension te bouwen voor PHP dan had je dat wel mogen vermelden, tis nou niet echt duidelijk in ieder geval WAAROM je dit nou probeert te doen.

[ Voor 28% gewijzigd door Verwijderd op 27-11-2005 19:16 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Volgens mij is het allemaal een nogal enorme verpakking om een enkele vraag: hoe interface ik PHP en C++ code?

Antwoord: staat gewoon in de docs: http://www.php.net/manual/en/zend.php :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 11-09 00:04
Iederéén is mij weer eens voor met posten..

De uitleg, het gaat om een gameserver in dit geval een World of Warcraft server, op dit moment hebben we alle functies in c++ staan deze handelt dus ook alle mogelijke OPPCODES af. Nu willen we graag dat iederéén dingen kan toevoegen aan de server (qua functionaliteit). De database draait op het MYSQL platform (INNODB). PHP is makkelijk en veel mensen kennen het, het heeft MYSQL ondersteuning, dus vandaar dat we deze taal wouden gebruiken.

Ik hoop dat het nu duidelijk is wat onze bedoeling is, en hopelijk is het mogelijk het topic open te houden.

Edit

@.oisyn
Die documentatie gaat volgens mij vooral over hoe je meer functionaliteit kunt toevoegen aan PHP, maar wij willen doormidden van PHP meer functionaliteit toevoegen aan c++.


@ Hel Gast
Je precies, zo wouden we het, (niet extensies voor PHP dus en dan de code via de CLI runnen, dit zou veel te langzaam worden, aangezien er wel ééns 20-120 requests per min komen)

[ Voor 25% gewijzigd door codeneos op 27-11-2005 19:23 ]

http://www.tweakers.net/gallery/119170/sys


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dus je hebt je eigen "library" met functies in C++, en andere mensen die deze server app willen gebruiken kunnen deze applicatie uitbreiden door nieuwe functies in PHP? Niet om het een of ander, maar dan zou ik persoonlijk liever alles in C++ doen, zekers als je PHP niet wil gebruiken voor webfunctionaliteit.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 11-09 00:04
Het is een gehele applicatie, niet alleen een lib. Alles in c++ dan moeten we de hele core opensource maken, en dit is gewoon niet mogelijk. (als we mensen wat vrijheid willen geven)

We hebben een taal nodig die goed met MYSQL overweg kan en makkelijk te leren. Vandaar onze keuze voor PHP, maar zoals ik al gezegt heb zijn we niet erg zeker of dit te realiseren valt. PHP is opensource maar kunnen we zoiest wel integreren met een c++ applicatie?

http://www.tweakers.net/gallery/119170/sys


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

codeneos schreef op zondag 27 november 2005 @ 19:18:
@.oisyn
Die documentatie gaat volgens mij vooral over hoe je meer functionaliteit kunt toevoegen aan PHP, maar wij willen doormidden van PHP meer functionaliteit toevoegen aan c++.
Wat is het probleem? Of PHP nou jouw code aanroept of dat jij PHP aanroept. Oftewel: of je applicatie nou met int main() begint, of met een startup functie die aangeroepen wordt door het PHP systeem. Dat moet toch geen probleem zijn, lijkt me.

Daarnaast, PHP is opensource dus andersom is natuurlijk ook vrij simpel te realiseren.
codeneos schreef op zondag 27 november 2005 @ 19:28:
Het is een gehele applicatie, niet alleen een lib. Alles in c++ dan moeten we de hele core opensource maken, en dit is gewoon niet mogelijk. (als we mensen wat vrijheid willen geven)
Wat is dat voor onzin, je kunt je systeem toch in een library gieten? Dan geef je alleen de binary vrij.

[ Voor 25% gewijzigd door .oisyn op 27-11-2005 19:32 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Schrijf een mooie klasse in C++ die alle belangrijke functionaliteit van de server biedt en gooi er wat documentatie bij. Plaats dit in een aparte dll.

Laat iedereen maar uitzoeken wat hij wil, wrappers bouwen om de dll, klaar?

Ik vind dit topic heel erg verwarrend.

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 11-09 00:04
Ja het geeft veel vrijheid een dll, maar het is eigenlijk niet de bedoeling. Naar enig beraad leek het onz beter dat we misschien pyton gaan gebruiken aangezien php een eindeloos verhaal word zonder een concrete oplossing.

De vrijheid die een DLL bied is heel mooi maar hoe moet iemand zonder kennis daar een wrapper om heen maken? Een dll is gewoon ge oplossing.

http://www.tweakers.net/gallery/119170/sys


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

codeneos schreef op zondag 27 november 2005 @ 20:13:
Ja het geeft veel vrijheid een dll, maar het is eigenlijk niet de bedoeling. Naar enig beraad leek het onz beter dat we misschien pyton gaan gebruiken aangezien php een eindeloos verhaal word zonder een concrete oplossing.
Waarom zou je de problemen die je bij PHP tegenkomt niet bij Python tegenkomen? De reden dat mensen je hier niet kunnen helpen is dat je simpelweg je probleem niet concreet maakt.
De vrijheid die een DLL bied is heel mooi maar hoe moet iemand zonder kennis daar een wrapper om heen maken? Een dll is gewoon ge oplossing.
Tuurlijk wel. Jij zal er echter wel goede documentatie voor moeten schrijven, maar dat is dan ook altijd het geval...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
codeneos schreef op zondag 27 november 2005 @ 20:13:
De vrijheid die een DLL bied is heel mooi maar hoe moet iemand zonder kennis daar een wrapper om heen maken? Een dll is gewoon ge oplossing.
Jullie zullen de wrappers moeten bouwen voor de leken.

Als je dat niet kan, zul je het moeten leren.

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 11-09 00:04
Oke, we hebben al een oplossing voor de PHP.

We wouden nu graag de PHP om zetten in PYTHON? Het is nog steeds het zelfde probleem maar omdat we all een converter van PYTHON naar C++ hebben. Misschien word het nu wat vaag, ik hoop het niet. Maar we zijn alleen nog opzoek naar een manier om php code om te zetten in python.

Deze python code vormen we tot een DLL die de server gebruikt.

(bedankt voor het dll idee :) )

Ook vond in een wrapper/converter van PHP naar c++, alleen ondersteunt deze te weinig functies, we hebben er aan gedacht om deze uit te breiden maar wouden eerst kijken of php naar python ook mogelijk was.

Hopelijk is het probleem nu concreter!

[ Voor 28% gewijzigd door codeneos op 27-11-2005 20:54 ]

http://www.tweakers.net/gallery/119170/sys


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Dus je wilt PHP code omzetten naar Python, om deze vervolgens weer naar C++ om te zetten?

Ik ga TV kijken :P

[edit]
Waarom niet meteen DLL functions aanroepen vanuit Python?

http://aspn.activestate.c...book/Python/Recipe/146847

[ Voor 38% gewijzigd door Lethalis op 27-11-2005 21:03 ]

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
/me Totale C++ n00b hier

Als je mensen uitbreidingen wil laten schrijven, waarom maak je dan niet een plugin systeem voor je server? Dus gewoon een app maken en die uit een map /plugins alle .dll's laten lezen. Ik denk dat het nu erg omslachtig wordt, wat je allemaal wilt doen.

Eerst PHP, nu Python, wat is het volgende? QBasic? Basic op je Grafisch Rekenmachine van Sharp? Een kladblaadje?

[ Voor 10% gewijzigd door Alex) op 27-11-2005 21:46 ]

We are shaping the future


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

codeneos schreef op zondag 27 november 2005 @ 20:50:
Hopelijk is het probleem nu concreter!
Eigenlijk niet.
con·creet (bn.)
1 als vorm voorstelbaar, stoffelijk, aan een vorm of voorwerp gebonden <=> abstract
2 duidelijk en bepaald => tastbaar
Je zegt nogmaals vaag dat je een combinatie van talen wil gebruiken maar ik lees nog steeds niet waarvoor je dat wil? Maak eens een voorbeeld van wat je concreet mogelijk wil maken? En wordt het nu PHP? Python? Beide?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is er dan nu ineens weer mis met PHP? Het kan toch prima wat jij wilt?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
.oisyn schreef op zondag 27 november 2005 @ 19:31:
[...]
Wat is het probleem? Of PHP nou jouw code aanroept of dat jij PHP aanroept. Oftewel: of je applicatie nou met int main() begint, of met een startup functie die aangeroepen wordt door het PHP systeem. Dat moet toch geen probleem zijn, lijkt me.
't Is wel handig als je global constructors werken. Maar dat lijkt me hier geen issue; de core is C++ en dus is de entry een C++ int main( )

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 11-09 00:04
Oke, ik het nog even wat concreter proberen te maken...

De server moet voor aan aantal acties formules gebruiken, bijvoorbeeld voor het berekenen van de XP die een speler krijgt naar het killen van een creature in de wereld. We kunnen deze gelijk in de core bakken maar dan is het niet mogelijk dat andere deze aanpassen (omdat ze bijvoorbeeld alle lvl 1 - 10 spelers extra XP willen geven).

Dus vandaar wouden we dit soort van functies opnemen in een script dat de server inleest en kan gebruiken, hier staat dus die formule in!

We willen deze functies (formules) laden uit een php bestand, de server moet dus php kunnen lezen. Nu hebben we al een functie de python leest en dit ombouwt tot een dll die de server gebruikt om het werk van nog een keer een hele wrapper te maken wouden we de PHP converten naar Python (indien mogelijk).

Oke de formule voor de XP is:

function CaclXP($mob_lvl,$mob_id,$player_lvl,$player_id)
{

if($mob_lvl > $player_lvl)
{
return $mob_lvl*5+(($mob_lvl-$player_lvl)*7.5)+100;
}
else
{
return $mob_lvl*5-(($player_lvl-$mob_lvl)*12.5)+100;
}

}

Als de speler een mob (creature) killed, dan krijgt hij dus XP naar deze formule. Dit is een hele simpele formule maar je kan via PHP ook (doormiddel van het ID) extra gegevens opzoeken over de creature in de database.

[ Voor 5% gewijzigd door codeneos op 28-11-2005 18:15 ]

http://www.tweakers.net/gallery/119170/sys


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Gewoon een DLL interface dus voor je plugin architectuur. In v1.0 zorg je gewoon dat het met een C DLL werkt, in versie 2.0 lever je een generieke PHP interface DLL mee.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1