Code:
BOOL CMover::IsArenaTarget( CMover* pMover )
{
CWorld* pWorld = GetWorld();
if( pWorld && pWorld->IsArena() )
{
int dx = (int)( pMover->GetPos().x - 510 );
int dy = (int)( pMover->GetPos().z - 527 );
int d = dx * dx + dy * dy;
if( d > 1246 )
return FALSE;
dx = (int)( GetPos().x - 510 );
dy = (int)( GetPos().z - 527 );
d = dx * dx + dy * dy;
if( d > 1246 )
return FALSE;
return TRUE;
}
return FALSE;
}
Das ganze ist relativ einfach:
-Die Arena ist ein Kreis, die Grenzen dieses Kreises werden mit dem Satz des Pythagoras berechnet (a²+b²=c²)
-Sagen wir mal unser a ist dx und unser b ist dy, also ist c² das d im Code
-Daraus folgt das wir einen Kreis mit Radius Wurzel(d) haben
-Der Mittelpunkt des Kreises liegt bei x=510 und z=527, das - steht davor weil diese Werte unseren NULLpunkt bilden
-Das ganze wird zweimal überprüft je einmal für den Angreifer und den Verteidiger, dementsprechend ließen sich auch Arenen bauen in denen man zuerst angreifbar ist bevor man selbst angreifen kann oder andersrum, durch Veränderungen des jeweiligen d.
Will man nun eine neue Arena einfügen mit neuen Radius,Mittelpunkt oder beidem geht man wie folgt vor:
-Man stellt den Mittelpunkt fest (am besten mit Beast).
-Ersetzt die alten x- und z-Werte mit den neuen
-Man geht solange entlang der x- ODER z-Achse vom Mittelpunkt in eine Richtung bis man am Arenarand ist
-Zieht den x- bzw. z-Wert am Rand von dem des Mittelpunkts ab
-Bildet das Quadrat der Differenz und trägt das in den Source ein.