1. Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Flammenwerfer :P

Dieses Thema im Forum "Programmierung" wurde erstellt von _Baum_, 18. September 2014.

  1. _Baum_
    Offline

    _Baum_

    Registriert seit:
    4. August 2013
    Beiträge:
    66
    Minecraft:
    PlueschAffe
    Hallo Community,

    da mir grade langweilig war habe ich beschlossen einen sinnlosen Flammenwerfer zu programmieren.
    100 Zombies in einem 2x2 Käfig zu grillen wird nie langweilig :p

    Code (Text):
    1.  
    2. @EventHandler
    3.     public void onFlammenwerfer(PlayerInteractEvent e)
    4.     {
    5.         /**
    6.         * @author PlueschBaum
    7.         */
    8.      
    9.         //Technische Daten
    10.         /**
    11.         * Wie oft wird pro Schuss ein Feuerstoß generiert?
    12.         */
    13.         int wiederholungen= 10;
    14.      
    15.         /**
    16.         * Welche Distanz ist zwischen den Feuerstößen? reichweite=distanz*wiederholungen
    17.         */
    18.         double distanz= 1;
    19.      
    20.         /**
    21.         * Wie viel Schaden solle ein Ziel pro Feuerstoß in Reichweite bekommen?
    22.         * max_schaden= wiederholungen*damage (Bei kleiner Distanz, da sonst außer Reichweite)
    23.         */
    24.         double damage=2;
    25.      
    26.         /**
    27.         * Wie lange soll ein Ziel brennen? In Ticks.
    28.         */
    29.         int brennen= 100;
    30.      
    31.         Player p= e.getPlayer();
    32.         if(e.getAction().equals(Action.RIGHT_CLICK_AIR)||e.getAction().equals(Action.RIGHT_CLICK_BLOCK))
    33.         {
    34.             ItemStack inHand=p.getItemInHand();
    35.             if(inHand.getType().equals(Material.BLAZE_POWDER))
    36.             {
    37.                 Location loc= p.getEyeLocation();
    38.                 World w= p.getWorld();
    39.                 Vector v= p.getLocation().getDirection().multiply(distanz);
    40.                 //Benötigt, da schnell aufeinander folgender Schaden ignoriert wird
    41.                 HashMap<Damageable,Integer>schaden= new HashMap<Damageable,Integer>();
    42.                 for(int i=0;i<wiederholungen;i++)
    43.                 {
    44.                     loc.add(v);
    45.                     if(loc.getBlock().getType().equals(Material.WATER)||loc.getBlock().getType().equals(Material.STATIONARY_WATER))
    46.                     {
    47.                         w.playEffect(loc, Effect.POTION_SWIRL_TRANSPARENT, 1);
    48.                         //Unterwasserfeuer wäre unrealistisch....
    49.                         break;
    50.                     }
    51.                     for(int x=0;x<10;x++)
    52.                     {
    53.                         w.playEffect(loc, Effect.MOBSPAWNER_FLAMES, 1);
    54.                         w.playEffect(loc, Effect.FLAME, 1);
    55.                         w.playEffect(loc, Effect.LAVA_POP, 10);
    56.                     }
    57.                     for(Entity en: w.getEntities())
    58.                     {
    59.                         Location target= en.getLocation();
    60.                         if(en instanceof Damageable&&target.distance(loc)<2&&!target.getBlock().getType().equals(Material.WATER)&&!target.getBlock().getType().equals(Material.STATIONARY_WATER))
    61.                         {
    62.                          
    63.                             Damageable dmg= (Damageable) en;
    64.                             if(dmg.equals(p))
    65.                             {
    66.                                 //Selbstverstümmlung, nein Danke!
    67.                                 break;
    68.                             }
    69.                             if(schaden.containsKey(dmg))
    70.                             {
    71.                                 schaden.put(dmg, schaden.get(dmg)+1);
    72.                             }
    73.                             else
    74.                             {
    75.                                 schaden.put(dmg, 1);
    76.                             }
    77.                              
    78.                         }
    79.                     }
    80.                  
    81.                 }
    82.                 for(Damageable d: schaden.keySet())
    83.                 {
    84.                  
    85.                     d.setFireTicks(brennen);
    86.                     d.damage((double)(schaden.get(d)*damage));
    87.                 }
    88.              
    89.                 int amount=inHand.getAmount()-1;
    90.                 if(amount<=0)
    91.                 {
    92.                     p.setItemInHand(null);
    93.                     return;
    94.                 }
    95.                 inHand.setAmount(amount);
    96.             }
    97.         }
    98.     }
    99.  
    100.  
    Sollten hier irgendwo bösartige Fehler lauern, lasst mich das wissen, ich werde sie ausmerzen!

    Den Code könnt ihr gerne übernehmen :D

    EDIT:
    Folgendes ist mir bekannt:
    - Man kann durch Wände schießen (praktisch :D)
    - Geht auch unterwasser (gefixt)
    - Die Flammeneffekte sind sehr groß, habe aber nichts passenderes gefunden ;) (mehr oder weniger gefixt)

    MfG
    _Baum_
     
    #1
    • Gefällt mir Gefällt mir x 2
  2. Werbung
    Online

    Werbung

  3. Janhektor
    Offline

    Janhektor

    Registriert seit:
    10. Januar 2013
    Beiträge:
    11
    Hey,

    die Idee finde ich gar nicht schlecht.

    Aber du solltest ein paar Konventionen in deinem Quellcode beachten.
    Bezeichner werden von den meisten Programmieren auf Englisch benannt, wodurch ein einheitlicher Stil gewährleistet ist.
    Wenn ich deinen Code also in ein Plugin von mir integrieren möchte, müsste ich ihn erstmal insoweit anpassen, bis er zu meinem übrigen Projekt passt.

    Und noch ein kleiner Praxistipp:
    Anstatt "Location.distance()" zu verwenden, nutze lieber distanceSquared() und quadriere den zurückgegebenen Wert.
    Folgendes läuft also auf's gleiche hinaus:

    if (location.distance(otherLocation) < 5) {
    // Mach was
    }

    und

    if (location.distanceSquared(otherLocation) < (5 * 5)) {
    // Mach was
    }


    Für das Ziehen einer Wurzel wird mehr Rechenleistung benötigt, als für das simple Multiplizieren von zwei Werten.

    Aber das, wie erwähnt, nur als Tipp.


    MfG
    Janhektor
     
    #2
  4. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.066
    Oder einfach "p.getNearbyEntities(5, 5, 5)" und instanceof check für LivingEntity.
     
    #3