[Tutorial]Wie spreade ich eine Waffe?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • [Tutorial]Wie spreade ich eine Waffe?

      Hey Leute,

      ihr seht doch sicherlich in anderen Gamemodes das die Waffen zb. wie bei KoG|lvl bei der Shotgun
      ein Radius von ca. 170° hat. Vielleicht denkt ihr euch ja "Das will ich auch haben, aber wie mache ich das nu?" und
      hier habe ich eine Lösung dazu. Ich finde das, dass spreaden nicht schwer ist.
      Mann muss aber auf manche Sachen achten und Mathe können.

      Was ihr braucht:

      • character.cpp
      • Mathe
      • Lust

      Die character.cpp findet ihr hier:
      teeworlds-0.6.x-source/src/game/server/entities/chracter.cpp

      Ich werde euch zuerst das spreaden der Shotgun zeigen. Weitere
      folgen dann wenn ich Zeit und Lust habe euch zu zeigen wie das geht.

      Ihr öffnet character.cpp und sucht per Suchfunktion eures Editors diesen Code:

      Quellcode

      1. case WEAPON_SHOTGUN:


      Jetzt müsstet ihr den Code von der Shotgun sehen. Doch wo müsst ihr etwas ändern
      um den Radius der Shotgun zu erhöhen?

      Das ist eig. sehr simple.
      Ihr müsst nun diesen Codeabschnitt bearbeiten:

      Quellcode

      1. int ShotSpread = 2;
      2. CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE); //Hier nichts ändern
      3. Msg.AddInt(ShotSpread*2+1); //Hier nichts ändern
      4. for(int i = -ShotSpread; i <= ShotSpread; ++i) //Hier nichts ändern
      5. {
      6. float Spreading[] = {-0.185f, -0.070f, 0, 0.070f, 0.185f};
      7. float a = GetAngle(Direction); //Hier nichts ändern
      8. a += Spreading[i+2];


      So, nun wollte ihr zb. nicht nur 5 Munition die aufeinmal rauskommt, sondern 7 Kugeln.
      Ihr fragt euch Sicherlich wie ich auf die 5 gekommen bin.

      Quellcode

      1. int ShotSpread = 2;
      2. //und
      3. Msg.AddInt(ShotSpread*2+1);


      Also, Msg.AddInt(ShotSpread*2+1); nimmt die Ziffer aus int ShotSpread = 2; das wäre dann die 2.
      Sprich: 2*2+1= 5

      So jetzt wollt ihr 7 Kugeln haben. Zuerst müsst ihr den Code
      int ShotSpread = 2; so umändern das nachher Msg.AddInt(ShotSpread*2+1); gleich 7 ergibt.

      Quellcode

      1. Lösung: 3*2+1 (int ShotSpread = 3;)


      Hier müsst ihr auch eine 3 einsetzten:

      Quellcode

      1. a += Spreading[i+2];
      2. //wird zu
      3. a += Spreading[i+3];


      So jetzt fehlt das wichtigste:

      Quellcode

      1. float Spreading[] = {-0.185f, -0.070f, 0, 0.070f, 0.185f};


      Ihr seht Zahlen mit einem f am ende.
      Bei jeder Zahl müsst ihr dann 0.070f dazurechnen.

      Dieser Code:

      Quellcode

      1. float Spreading[] = {-0.185f, -0.070f, 0, 0.070f, 0.185f};
      2. //müsste danach so aussehen:
      3. float Spreading[] = {-0.210f,-0.140f, -0.070f, 0, 0.070f, 0.140f, 0.210f};



      Aufgabe:
      Ihr gebt der Shotgun 9 Kugeln. Wie das geht habe ich euch beschrieben.
      Wenn ich Hilfe braucht etc. schreibt mir.

      ~moritz.

      PS: Falls ihr fehler findet, bitte sagt es mir ;)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von moritz. ()

    • Ganz ehrlich. Erst dachte ich das selbe wie Pixel über die Tutorials. Eigentlich ist das meiste Schrott weil man nichts Step by Step lernen kann, aber bei der Motivation die hier an den Tag gelegt wird kann ich mir vorstellen, dass mit der Zeit eine ordentliche Sammlung an Codes zusammenkommt.
      Und ganz ehrlich am Anfang ist es einfacher im Code rumzuschnipseln als sich direkt etwas auszudenken.

      Aber auch wenn viele solche Dinge zusammenkommen, dann sollte der kommentierte Code auf jeden Fall gemacht werden. (Was ja angekündigt wurde und ich denke Pata sitzt schon dran)
    • hi,

      nochmal zu dem thema & sorry für den push. hab hier ein code, bei dem man nur eine variable bzw. ein wert ändern muss, um den shotgunspread zu ändern. erklärung gibts aber nicht dazu ;D

      [cpp]
      int ShotSpread = 2; // <- standardwert
      CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE);
      Msg.AddInt(ShotSpread*2+1);
      for(int i = -ShotSpread; i <= ShotSpread; ++i)
      {
      float Spreading = (float)i * 0.1;
      float a = GetAngle(Direction);
      a += Spreading;
      float v = 1-(absolute(i)/(float)ShotSpread);
      float Speed = mix((float)GameServer()->Tuning()->m_ShotgunSpeeddiff, 1.0f, v);
      CProjectile *pProj = new CProjectile(GameWorld(), WEAPON_SHOTGUN,
      m_pPlayer->GetCID(),
      ProjStartPos,
      vec2(cosf(a), sinf(a))*Speed,
      (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_ShotgunLifetime),
      1, m_pPlayer->m_ShotgunExp, 0, -1, WEAPON_SHOTGUN);
      // pack the Projectile and send it to the client Directly
      CNetObj_Projectile p;
      pProj->FillInfo(&p);

      for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++)
      Msg.AddInt(((int *)&p));
      }

      Server()->SendMsg(&Msg, 0,m_pPlayer->GetCID());
      GameServer()->CreateSound(m_Pos, SOUND_SHOTGUN_FIRE);
      [/cpp]
    • [cpp]int RifleSpread = 1;
      float Spreading[] = {-0.070f, 0, 0.070f};
      for(int i = -RifleSpread; i <= RifleSpread; ++i)
      {
      float a = GetAngle(Direction);
      a += Spreading[i+1];
      new CLaser(GameWorld(), m_Pos, vec2(cosf(a), sinf(a)), GameServer()->Tuning()->m_LaserReach, m_pPlayer->GetCID());
      }[/cpp]

      wie du das dann so schön flexibel wie mit dem oberen code bei der shotgun machst ist mir egal, hast hier und da oben ne vorlage - wenn du nicht weißt wie das geht dann lern c++ und nerv uns damit nicht.
      danke