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
    pasce1998 und MiCrJonas gefällt das.
  2. 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
  3. MiCrJonas
    Offline

    MiCrJonas

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