• 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

_Baum_

Kuhfänger
Registriert
4 August 2013
Beiträge
66
Diamanten
0
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:
@EventHandler
    public void onFlammenwerfer(PlayerInteractEvent e)
    {
        /**
        * @author PlueschBaum
        */
      
        //Technische Daten
        /**
        * Wie oft wird pro Schuss ein Feuerstoß generiert?
        */
        int wiederholungen= 10;
      
        /**
        * Welche Distanz ist zwischen den Feuerstößen? reichweite=distanz*wiederholungen
        */
        double distanz= 1;
      
        /**
        * Wie viel Schaden solle ein Ziel pro Feuerstoß in Reichweite bekommen?
        * max_schaden= wiederholungen*damage (Bei kleiner Distanz, da sonst außer Reichweite)
        */
        double damage=2;
      
        /**
        * Wie lange soll ein Ziel brennen? In Ticks.
        */
        int brennen= 100;
      
        Player p= e.getPlayer();
        if(e.getAction().equals(Action.RIGHT_CLICK_AIR)||e.getAction().equals(Action.RIGHT_CLICK_BLOCK))
        {
            ItemStack inHand=p.getItemInHand();
            if(inHand.getType().equals(Material.BLAZE_POWDER))
            {
                Location loc= p.getEyeLocation();
                World w= p.getWorld();
                Vector v= p.getLocation().getDirection().multiply(distanz);
                //Benötigt, da schnell aufeinander folgender Schaden ignoriert wird
                HashMap<Damageable,Integer>schaden= new HashMap<Damageable,Integer>();
                for(int i=0;i<wiederholungen;i++)
                {
                    loc.add(v);
                    if(loc.getBlock().getType().equals(Material.WATER)||loc.getBlock().getType().equals(Material.STATIONARY_WATER))
                    {
                        w.playEffect(loc, Effect.POTION_SWIRL_TRANSPARENT, 1);
                        //Unterwasserfeuer wäre unrealistisch....
                        break;
                    }
                    for(int x=0;x<10;x++)
                    {
                        w.playEffect(loc, Effect.MOBSPAWNER_FLAMES, 1);
                        w.playEffect(loc, Effect.FLAME, 1);
                        w.playEffect(loc, Effect.LAVA_POP, 10);
                    }
                    for(Entity en: w.getEntities())
                    {
                        Location target= en.getLocation();
                        if(en instanceof Damageable&&target.distance(loc)<2&&!target.getBlock().getType().equals(Material.WATER)&&!target.getBlock().getType().equals(Material.STATIONARY_WATER))
                        {
                          
                            Damageable dmg= (Damageable) en;
                            if(dmg.equals(p))
                            {
                                //Selbstverstümmlung, nein Danke!
                                break;
                            }
                            if(schaden.containsKey(dmg))
                            {
                                schaden.put(dmg, schaden.get(dmg)+1);
                            }
                            else
                            {
                                schaden.put(dmg, 1);
                            }
                              
                        }
                    }
                  
                }
                for(Damageable d: schaden.keySet())
                {
                  
                    d.setFireTicks(brennen);
                    d.damage((double)(schaden.get(d)*damage));
                }
              
                int amount=inHand.getAmount()-1;
                if(amount<=0)
                {
                    p.setItemInHand(null);
                    return;
                }
                inHand.setAmount(amount);
            }
        }
    }

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_
 
Zuletzt bearbeitet:

Janhektor

Minecrafter
Registriert
10 Januar 2013
Beiträge
11
Diamanten
0
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
 
Oben