Erste Schritte

    • Erste Schritte

      Hier schonmal eine kurze Anleitung zum Modden:
      (Wichtig: Es wäre schön wenn jemand zu einzelenen Punkten (z.B. Kompilieren unter Windows/Linux/Mac) ein ausführlicheres Tutorial schreibt! )

      1. Lade dir die aktuellste Teeworlds-Src runter (Diese sich unter github.com/teeworlds/teeworlds )

      2. Vergewissere dich dass du mindestens ein Code-Bearbeitungsprogramm auf deinem Computer installiert hast!
      (Notepad++; Visual C++; etc.)
      Zudem solltest du unter Windows Visual C++ (/-Express Edition) 2005/2008 installiert haben.

      3. Entpacke die Src.
      (Die Src beinhaltet alle Dateien, die TW nacher benötigt.)

      _____________________________________________________________________________________________



      Es gibt verschiedene Mod-Typen:
      -Serverseitig (auch für den normalen Clienten zugänglich)
      -Clientseitig (kompatible mit den normalen Servern)
      -Beides zusammen (zum Spielen auf gemoddeten Servern,
      die eine Veränderung des Clients benötigen)

      Zum Anfang ist es ganz ratsam mit einer kleinen Server-Modifikation zu beginnen:

      Geht dazu in euren Src-Ordner und öffnet folgende Ordner:

      TW-Src/src/game/server/entities/

      Dieser Ordner, beinhaltet alle Gameplay(Entities)-Objekte:

      character.cpp (Charactere(/Tees)
      projectile.cpp (Projectile [Grenade; Gun; Shotgun])
      laser.cpp (Laser)
      flag.cpp (Flagge)
      pickup.cpp (Pickups[Herzen; Schilde; Waffen; Powerups(Ninja) ])





      Für unsere kleine Modifikation benutzen wir character.cpp.

      Ein kleiner Überblick über die Funktionen:

      - Spawn (Wird aufgerufen, wenn der Tee spawnt)
      - Destroy ("Zerstört" den Tee)
      - SetWeapon (Wechselt zu der gewünschten Waffe, wenn diese Verfügbar ist)
      - IsGrounded Gibt an, ob der Tee den Boden berührt [True] oder nicht [False])
      - HandleNinja Beschreibt die Verwendung von "Ninja")
      - DoWeaponSwitch (Wechselt die Waffe, (siehe auch SetWeapon))
      - HandleWeaponSwitch (Prüft ob gewünschte Waffe verfügbar ist (siehe auch DoWeaponSwitch))
      - FireWeapon (Feuert die Waffe ab, wenn möglich)
      - HandleWeapons (Verwendung der Waffen (siehe auch HandleNinja/FireWeapon) & Ammo-Regen)
      - GiveWeapon (Gibt dem Tee eine bestimmte Waffe, mit bestimmter Anzahl an Munition)
      - GiveNinja (Gibt dem Tee das Powerup "Ninja" (siehe auch HandleNinja))
      - SetEmote (Setzt dem Tee eine best. Emote)
      - OnPredictedInput
      OnDirectInput (Verarbeitung des Spieler-Inputs (der Spieler-Eingaben))
      - Tick (Tick des Tees (wird 50 mal/sec. aufgerufen ->~alle 20 ms)
      - TickDefered (Prüft die Bewegung des Tees)
      - IncreaseHealth (Gibt dem Spieler eine gewisse Menge an Herzen)
      - IncreaseArmor (Gibt dem Spieler eine gewisse Menge an Schilden)
      - Die (Lässt den Tee sterben)
      - TakeDamage (Gibt dem Spieler best. Schaden, von einem best. Spieler, mit einer best. Waffe)
      - Snap ("Wird vom Clienten aufgerufen"- Gibt dem Clienten alle nötigen Infos zum Character)


      Wir schauen uns einmal FireWeapon() genauer an:

      Unser (noch recht einfaches) Ziel ist es, doppelt so schnell feuern zu können;
      Dazu benötigen wir Informationen, wie festgelegt wird, wie lange dieses Nachladen dauert.

      Gleich am Anfang begegnet uns:

      Source Code

      1. if(m_ReloadTimer != 0)
      2. return;


      Wenn wir nicht Nachgeladen haben, brechen wir den Vorgang ab.
      --> "m_ReloadTimer" ist die Variable die wir brauchen

      Aber wie können wir jetz machen, dass Wir schneller Nachladen ?

      Ganz einfach:
      Am Ende von FireWeapon() finden wir diesen Absatz (alternativ mit Suchfunktion arbeiten :) ).


      Source Code

      1. if(!m_ReloadTimer)
      2. m_ReloadTimer = g_pData->m_Weapons.m_aId[m_ActiveWeapon].m_Firedelay * Server()->TickSpeed() / 1000;

      Gehen wir das einmal durch:

      Source Code

      1. if(!m_ReloadTimer)

      = Wenn "m_ReloadTimer" 0 ist (also wenn wir nachgeladen haben)


      Source Code

      1. m_ReloadTimer = g_pData->m_Weapons.m_aId[m_ActiveWeapon].m_Firedelay * Server()->TickSpeed() / 1000;

      Dann ist "m_ReloadTimer" = Die Nachladedauer, von der aktuellen Waffe (in ms) * (Ticks/sec [50]) /1000;
      --> "m_ReloadTimer" = Die Nachladedauer, von der aktuellen Waffe (in Ticks);


      Wir wollen doppelt so schnell schießen--> Nachladezeit halbieren; dafür teilen wir durch 2000 anstatt durch 1000

      Source Code

      1. if(!m_ReloadTimer)
      2. m_ReloadTimer = g_pData->m_Weapons.m_aId[m_ActiveWeapon].m_Firedelay * Server()->TickSpeed() / 2000;








      Datei abspeichern

      Kompilieren (Tutorial folgt)

      Nun habt ihr eine eigene kleine Modifikation,
      aber Vorsicht:
      Es ist nicht erlaubt, Mods unter normalen GameTypes laufen zu lassen;
      schreibt daher in eure settings [sv_gametype mod].

      Am besten ihr schaut euch selber mal in der Src um, bei Fragen einfach im Support-Bereich Posten,
      [TIPP: Die Suchfunktion eures Editors kann euch oft schon helfen^^]

      The post was edited 1 time, last by Patafix ().

    • Ich denke da der Coder Bereich gerade erst neu ist werden weitere Tutorials aufjedenfall folgen. Zu dem Tutorial könnte man gut einbinden wie man Aip in einen Mod einbaut.
      Wo ich dran hänge ist genau zu verstehen wie Server()->TickSpeed() und Server()->Tick() allein funktioniert ^^ (für Spawnprotection Build mod... ;) )
    • Das im Moment nur hier, damit im Tutorial-Bereich zumindest etwas steht, das wird noch erweitert ^^
      Ich (und hoffentlich viele weitere) werden noch weitere Tutorials schreiben: z.B. Kompilieren
      Auch habe ich geplant, eine Tw-Source zu kommentieren (was ich hier mit der Erklärung der einzelnen Funtionen ja schon ein wenig getan habe) , damit es Anfänger leichter haben ;)

      warkid wrote:

      Ich denke da der Coder Bereich gerade erst neu ist werden weitere Tutorials aufjedenfall folgen. Zu dem Tutorial könnte man gut einbinden wie man Aip in einen Mod einbaut.
      Wo ich dran hänge ist genau zu verstehen wie Server()->TickSpeed() und Server()->Tick() allein funktioniert ^^ (für Spawnprotection Build mod... ;) )

      Ja du hast vollkommen recht, und ich werd demnächst dann mal eine Übersicht über Tutorials und Code-Lösungen machen, die vorhanden sind oder benötigt werden ;)
    • warkid wrote:

      Ich denke da der Coder Bereich gerade erst neu ist werden weitere Tutorials aufjedenfall folgen. Zu dem Tutorial könnte man gut einbinden wie man Aip in einen Mod einbaut.
      Wo ich dran hänge ist genau zu verstehen wie Server()->TickSpeed() und Server()->Tick() allein funktioniert ^^ (für Spawnprotection Build mod... ;) )


      Ich denke, dass gehört nicht zu diesem Tutorial ...