|
@@ -59,7 +59,11 @@ Spiel::~Spiel()
|
|
|
{
|
|
|
teams->release();
|
|
|
stat->release();
|
|
|
+ for( auto s = spieler->getIterator(); s; s++ )
|
|
|
+ s->setTeam( 0 );
|
|
|
spieler->release();
|
|
|
+ for( auto o = objekte->getIterator(); o; o++ )
|
|
|
+ o->setTeam( 0 );
|
|
|
objekte->release();
|
|
|
welt->release();
|
|
|
asteroids->release();
|
|
@@ -138,12 +142,12 @@ void Spiel::setSpielerNummern( int anzahl, Array< int > * spielerNummern )
|
|
|
for( int i = 0; i < sts->teamAnzahl; i++ )
|
|
|
teams->set( karte->createTeam( i ), i );
|
|
|
stat->setTeamNamen( sts->teamName->getThis() );
|
|
|
- int objektAnzahl = karte->getObjektAnzahl();
|
|
|
- for( int i = 0; i < objektAnzahl; i++ )
|
|
|
+ for( auto o = karte->getObjekte(); o; o++ )
|
|
|
{
|
|
|
- SpielObjekt *obj = karte->createObjekt( i );
|
|
|
+ SpielObjekt *obj = karte->createObjekt( o->id );
|
|
|
+ obj->setTeam( teams->get( o->team - 1 ) );
|
|
|
welt->addObject( obj->getThis() );
|
|
|
- objekte->set( obj, i );
|
|
|
+ objekte->add( obj );
|
|
|
}
|
|
|
welt->setSize( karte->getSize().x, karte->getSize().y );
|
|
|
welt->setSize( 1 );
|
|
@@ -279,33 +283,33 @@ void Spiel::nachricht( int accountId, int len, char *bytes )
|
|
|
}
|
|
|
break;
|
|
|
case 9: // Skill verwendung
|
|
|
+ {
|
|
|
+ bytes++;
|
|
|
+ char art = *bytes;
|
|
|
+ len--;
|
|
|
+ for( int i = 0; i < spielerAnzahl; i++ )
|
|
|
{
|
|
|
- bytes++;
|
|
|
- char art = *bytes;
|
|
|
- len--;
|
|
|
- for( int i = 0; i < spielerAnzahl; i++ )
|
|
|
+ Spieler *tmp = spieler->z( i );
|
|
|
+ if( tmp && tmp->getAccountId() == accountId )
|
|
|
{
|
|
|
- Spieler *tmp = spieler->z( i );
|
|
|
- if( tmp && tmp->getAccountId() == accountId )
|
|
|
+ if( !tmp->istAmLeben() )
|
|
|
+ break;
|
|
|
+ if( !tmp->setSkill( art ) )
|
|
|
{
|
|
|
- if( !tmp->istAmLeben() )
|
|
|
- break;
|
|
|
- if( !tmp->setSkill( art ) )
|
|
|
- {
|
|
|
- saveMSG = 0;
|
|
|
- break;
|
|
|
- }
|
|
|
- for( int j = 0; j < spielerAnzahl; j++ )
|
|
|
- {
|
|
|
- Spieler *s = spieler->z( j );
|
|
|
- if( s && s->zKlient() )
|
|
|
- s->zKlient()->sendeSkillNachricht( tmp->getSpielerNummer(), art, spielZeit );
|
|
|
- }
|
|
|
+ saveMSG = 0;
|
|
|
break;
|
|
|
}
|
|
|
+ for( int j = 0; j < spielerAnzahl; j++ )
|
|
|
+ {
|
|
|
+ Spieler *s = spieler->z( j );
|
|
|
+ if( s && s->zKlient() )
|
|
|
+ s->zKlient()->sendeSkillNachricht( tmp->getSpielerNummer(), art, spielZeit );
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
- break;
|
|
|
}
|
|
|
+ break;
|
|
|
+ }
|
|
|
case 0xA: // Use active skill
|
|
|
{
|
|
|
bytes++;
|
|
@@ -447,6 +451,50 @@ void Spiel::tick( double zeit )
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ int objektAnzahl = objekte->getEintragAnzahl();
|
|
|
+ for( int j = 0; j < objektAnzahl; j++ )
|
|
|
+ {
|
|
|
+ SpielObjekt *attacked = objekte->z( j );
|
|
|
+ if( attacked && ( !attacked->zTeam() || attacked->zTeam()->id != team ) && attacked->doesCollideWithLaser() && attacked->istTreffer( tmp->getPosition() ) )
|
|
|
+ { // Treffer
|
|
|
+ Spieler *attacker = 0;
|
|
|
+ for( int k = 0; k < spielerAnzahl; k++ )
|
|
|
+ {
|
|
|
+ Spieler *tmpS = spieler->z( k );
|
|
|
+ if( tmpS && tmpS->getSpielerNummer() == tmp->getSpieler() )
|
|
|
+ attacker = tmpS;
|
|
|
+ }
|
|
|
+ double intens = tmp->getIntensity() * ( ( tmp->getSpeed() - attacked->getSpeed() ).getLength() / 200 );
|
|
|
+ bool kill = attacked->nimmSchaden( intens, attacker ? attacker->getLevel() : 1 );
|
|
|
+ if( tmp->getSpeed().getLengthSq() > 0 )
|
|
|
+ attacked->impuls( tmp->getPosition() - tmp->getSpeed(), tmp->getSpeed() * 0.3f );
|
|
|
+ int skillP = attacker->getSkillP();
|
|
|
+ attacker->machSchaden( intens, attacked->getLevel(), attacked->doesShotAddEp() );
|
|
|
+ float erf = attacker->getEp();
|
|
|
+ if( kill )
|
|
|
+ attacker->addKill( attacked->getLevel(), attacked->doesShotAddEp() );
|
|
|
+ for( int k = 0; k < spielerAnzahl; k++ )
|
|
|
+ {
|
|
|
+ Spieler *sp = spieler->z( k );
|
|
|
+ if( sp )
|
|
|
+ sp->zKlient()->sendeObjektTreffer( tmp->getId(), attacked->getObjektId(), spielZeit, erf, skillP );
|
|
|
+ if( kill && sp )
|
|
|
+ sp->zKlient()->sendeObjektTod( attacked->getObjektId(), tmp->getSpieler(), spielZeit );
|
|
|
+ }
|
|
|
+ if( kill )
|
|
|
+ {
|
|
|
+ if( teams->z( team - 1 ) )
|
|
|
+ teams->z( team - 1 )->punkte++;
|
|
|
+ if( teams->z( team - 1 )->punkte == teams->z( team - 1 )->maxPunkte )
|
|
|
+ ende = 1;
|
|
|
+ }
|
|
|
+ welt->removeObject( tmp );
|
|
|
+ shots->remove( i );
|
|
|
+ anz--;
|
|
|
+ i--;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
int aAnz = asteroids->getEintragAnzahl();
|
|
|
for( int j = 0; j < aAnz; j++ )
|
|
|
{
|